{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 数据预处理"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-09-21T11:06:07.809014Z",
     "start_time": "2019-09-21T11:06:07.303Z"
    }
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "Registered S3 methods overwritten by 'ggplot2':\n",
      "  method         from \n",
      "  [.quosures     rlang\n",
      "  c.quosures     rlang\n",
      "  print.quosures rlang\n",
      "Loading required package: jiebaRD\n"
     ]
    }
   ],
   "source": [
    "# 载入程序包\n",
    "library(stringr)\n",
    "library(ggplot2)\n",
    "library(wordcloud2)\n",
    "library(jiebaR)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-09-21T11:06:07.925429Z",
     "start_time": "2019-09-21T11:06:07.311Z"
    }
   },
   "outputs": [],
   "source": [
    "# 读入数据\n",
    "data <- read.csv('data.csv',\n",
    "                 header = FALSE,\n",
    "                 col.names = c(\"User\", \"URL\", \"Date\", \"Comment\", \n",
    "                               \"Rating\", \"Recommendation\"),\n",
    "                 colClasses = c(\"character\", \"character\", \"Date\",\n",
    "                                \"character\", \"factor\", \"integer\"))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-09-21T11:06:07.959820Z",
     "start_time": "2019-09-21T11:06:07.319Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "0"
      ],
      "text/latex": [
       "0"
      ],
      "text/markdown": [
       "0"
      ],
      "text/plain": [
       "[1] 0"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# 缺失值查验\n",
    "sum(apply(data, 2, is.na))\n",
    "# 去除无用的因子\n",
    "data <- subset(data, Rating != \"\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-09-21T11:06:08.030123Z",
     "start_time": "2019-09-21T11:06:07.327Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "'data.frame':\t498 obs. of  6 variables:\n",
      " $ User          : chr  \"王大根\" \"李阿斗\" \"光明小卖部\" \"同志亦凡人中文站\" ...\n",
      " $ URL           : chr  \"https://www.douban.com/people/diewithme/\" \"https://www.douban.com/people/gailsylee/\" \"https://www.douban.com/people/gooooooooooohe/\" \"https://www.douban.com/people/3540441/\" ...\n",
      " $ Date          : Date, format: \"2018-01-19\" \"2017-11-25\" ...\n",
      " $ Comment       : chr  \" 在这种家庭里做一条狗都好啊\\\\\\n        \" \" 当时出国以后的第一最大感受就是尊重，不论老弱病孕还是任何“与众不同”，都不会有人上下打量你。我不能说他们内心是否\"| __truncated__ \" 所有人都知道是化妆只有我一个人以为请的真实病人出演吗。。。\\\\\\n        \" \" 有种糖放多了的感觉，精华基本都在预告里了。但对孩子们的纯真友情毫无抵抗力啊，就像被温柔的抚摸了一下软肋。Jacob \"| __truncated__ ...\n",
      " $ Rating        : Factor w/ 6 levels \"\",\"力荐\",\"很差\",..: 2 2 2 4 4 6 6 2 2 4 ...\n",
      " $ Recommendation: int  6443 3414 3339 1811 1701 1210 1448 1391 1211 1056 ...\n"
     ]
    }
   ],
   "source": [
    "# data format\n",
    "str(data)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 评论分析"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 评论字数分析\n",
    "长评与短评与推荐与否。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-09-21T11:06:08.072034Z",
     "start_time": "2019-09-21T11:06:07.336Z"
    }
   },
   "outputs": [],
   "source": [
    "# 去除多余的标点符号，计算评论字数\n",
    "clean_string <- function (string){\n",
    "  return(gsub(\"[\\\\，\\\\.\\\\。\\\\\\r\\n\\ ]\", \"\", string))\n",
    "}\n",
    "data$Comment <- sapply(data$Comment, clean_string)\n",
    "data$words <- sapply(data$Comment, nchar)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-09-21T11:06:08.111948Z",
     "start_time": "2019-09-21T11:06:07.348Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "63.4016064257028"
      ],
      "text/latex": [
       "63.4016064257028"
      ],
      "text/markdown": [
       "63.4016064257028"
      ],
      "text/plain": [
       "[1] 63.40161"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "52.5"
      ],
      "text/latex": [
       "52.5"
      ],
      "text/markdown": [
       "52.5"
      ],
      "text/plain": [
       "[1] 52.5"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# 中心测度： 平均数，中位数\n",
    "mean(data$words)\n",
    "median(data$words)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-09-21T11:06:08.151951Z",
     "start_time": "2019-09-21T11:06:07.356Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<ol class=list-inline>\n",
       "\t<li>2</li>\n",
       "\t<li>217</li>\n",
       "</ol>\n"
      ],
      "text/latex": [
       "\\begin{enumerate*}\n",
       "\\item 2\n",
       "\\item 217\n",
       "\\end{enumerate*}\n"
      ],
      "text/markdown": [
       "1. 2\n",
       "2. 217\n",
       "\n",
       "\n"
      ],
      "text/plain": [
       "[1]   2 217"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "1951.2830557643"
      ],
      "text/latex": [
       "1951.2830557643"
      ],
      "text/markdown": [
       "1951.2830557643"
      ],
      "text/plain": [
       "[1] 1951.283"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "44.1733296884478"
      ],
      "text/latex": [
       "44.1733296884478"
      ],
      "text/markdown": [
       "44.1733296884478"
      ],
      "text/plain": [
       "[1] 44.17333"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "<dl class=dl-horizontal>\n",
       "\t<dt>0%</dt>\n",
       "\t\t<dd>2</dd>\n",
       "\t<dt>25%</dt>\n",
       "\t\t<dd>24</dd>\n",
       "\t<dt>50%</dt>\n",
       "\t\t<dd>52.5</dd>\n",
       "\t<dt>75%</dt>\n",
       "\t\t<dd>101.75</dd>\n",
       "\t<dt>100%</dt>\n",
       "\t\t<dd>217</dd>\n",
       "</dl>\n"
      ],
      "text/latex": [
       "\\begin{description*}\n",
       "\\item[0\\textbackslash{}\\%] 2\n",
       "\\item[25\\textbackslash{}\\%] 24\n",
       "\\item[50\\textbackslash{}\\%] 52.5\n",
       "\\item[75\\textbackslash{}\\%] 101.75\n",
       "\\item[100\\textbackslash{}\\%] 217\n",
       "\\end{description*}\n"
      ],
      "text/markdown": [
       "0%\n",
       ":   225%\n",
       ":   2450%\n",
       ":   52.575%\n",
       ":   101.75100%\n",
       ":   217\n",
       "\n"
      ],
      "text/plain": [
       "    0%    25%    50%    75%   100% \n",
       "  2.00  24.00  52.50 101.75 217.00 "
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# 散布： 极差， 方差， 标准差， 分位数 \n",
    "range(data$words)\n",
    "var(data$words)\n",
    "sd(data$words)\n",
    "quantile(data$words)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "可以看出，评论的字数总体偏短，75%的评论在100字以内，且其中50%的评论在50词以内。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-09-21T11:06:09.219999Z",
     "start_time": "2019-09-21T11:06:07.369Z"
    }
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "`stat_bin()` using `bins = 30`. Pick better value with `binwidth`.\n"
     ]
    },
    {
     "data": {
      "image/png": "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\no48+WrdunUql+vnnn2u9kJFl2TZt2ojT33333ezZs7/66itCyMSJEzdv3lxt5T/+8Y+N+sG8\nAAAAnsLDw8+ePTtlypQNGzb069fPZrOJy6uqqpxOp16vJ4QEBgZevXqVEHLo0KGRI0cuXrx4\nyJAhhJCPPvpo/fr11Rqs9YmGXkIQAgCA3PR6/c6dOyMjIz///PObN2+KCwVBGDp0aGRk5J//\n/Gf3midPnoyNjZ03b96cOXMuXbrUoUMHrVarVqslLAZBCAAACmjevHleXp6/v797yd///vfv\nv/9+27Ztnqt17do1LS1t1qxZhYWFAwYM2Lp1a2xsrLSVIAgBAEBWTqezqKiIEMJxXEDA/z+K\nf/bs2RkzZhgMhl9++aWwsLB3797icoPBMGvWLIfD8dxzz8XHxw8ZMuT8+fM122QYpmvXrnWr\nB0EIAACyunnzZrdu3XieDwwMvH79OiHk8uXLI0aMiIqK+ve//52fn//yyy/v378/PDxcXN/l\ncs2aNevf//73l19+efr06XHjxrmbstlsFoulVatWWq32woULdasHQQgAALJq27at1Wo9derU\niBEjCCF5eXmjRo0aOXLkjBkzhg0bNm7cOLPZPHTo0AMHDnTv3t3hcCQnJ2/dulWv17du3bp1\n69aFhYXuprKystavX3/gwIH61IMgBCCEEPW7b3pz8N3bSztySupZDwAldu/ePWbMmIULF775\n5punT58WF86cObOkpGTYsGEXLlzYs2fP4cOHs7KyJk2a1EA1IAgBAEAxw4YNy83NHTRoULXl\nb7zxRnx8vMFgGDNmTGxs7I0bNxquBtxZBgAAFKPVamumICGEYZi+ffuKE55nljYEBCEAAMhN\nEIRDhw5ZLJZr164pXQt2jQIAgLxcLte0adN27979wgsvDBgw4Pnnn//973/fpUuXTp065ebm\nms1mm81mtVptNpvJZOrcuXOtjVy+fJll2evXr9fnnjIiBCEAAMjqypUrOTk5R44c6dKly0sv\nvbR+/frnnnvu+vXrPM+711Gr1Tqdbu3atfcKwunTpxcWFvr5+aWkpNSzHgQhAADIKiQk5Mcf\nfxSP/HXt2nXlypUrV64UBMFmszkcDp1Op9VqWfZ/jtx169atpOR/Tsb+17/+JVU9TSkIJTxe\nyjAMy7INfQCWHvXZkizL+vn5SVgMterZn8X9S76+vrU+B0AejeEXk2VZGc7OuD+O4wRB0Gq1\n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\n2v8D2cqXBfgS6iEAAAAASUVORK5CYII=",
      "text/plain": [
       "plot without title"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# 直方图\n",
    "options(repr.plot.width=5, repr.plot.height=4)  # plot size\n",
    "words <- ggplot(data, aes(fill=Rating, x=words))\n",
    "words + geom_bar(stat = 'bin')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "在看出总体评论字数偏少的峰同时，观察到另外一个字数较多的峰，且多为较好的评价（还行，推荐和力荐占据了绝大部分）。可以看出相当一部分喜欢这部电影的观众在写影评上还是下了一定的功夫的。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-09-21T11:06:09.985268Z",
     "start_time": "2019-09-21T11:06:07.381Z"
    }
   },
   "outputs": [
    {
     "data": {
      "image/png": "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\n2tra5cuXDx8+XIeKmYuSkgqANzdpWKZaGm3Ja5R8KQUxjJfRw7GQJ1uySwZtfBGltthcOqyy\nprYyTTVSBjgeUbpWSqGe0TisWLFiwoQJ6s9er7eoqGjTpk0APvroo5tuuil6M86557hx48a9\n8cYb0V/Hjx//+uuvqz/7fG1fHyPWzovHHnts7NixQ4cOvfvuuwcNGgRg165dixcvrqmpefvt\nt9t8+o6CO5xgDB5Ng9DTBEBxUhAaI09ywKCphNUhTy+r8asoZEgK9AnCxrC6B5PmBbcLZxwA\ndG126LQ8QSfwz3/+0263jxw5EsCrr746atSo6J+8Xm9xcbH6s8fj+fLLLy0WS/TXL774YsGC\nBQBGjx7d5vnusb5UR40a9d577/3sZz976KGHogcHDBiwZMkStepJThC43cE9mn5oejxgjDsN\nvlDUacU4g0JzjZFAQIkUWIz/AtTSItRhlTW1uzXDZINlWlrgui76pug7YT9p+P3++vr6+vr6\nQCBQWVlZUFDw4osvjho1au3ateqG9Zdeeul7772XkZExbty41NTUxuPrmYwfP37EiBFz5szp\n168fgAkTJsydO/fGG29sZ33i+M42adKkCRMmlJeXl5WVAejVq1evXr06yYR6ADwllTdpubgM\n93i4zY5O8x9oNkZ1japt0DyjLxACLQvKuCN6tQgzTNYihMAA6Do6iis6T9hPFp9++uns2bN9\nPp/X6x09evT3v//9zZs3OxyOV155JRgMhsPhd999F0Dv3r3HjRvHOfd6W67l//73v7/yyivH\njx9fVFQE4Omnn87NzfV4PAAEQXC2tV0R60t18ODBU6ZMmTx58sUXX9y7d++2nUyW5ZkzZy5c\nuDArK0s9wjlftmzZhg0bZFkeM2bMD37wAzVZz3TcQNzhRF0NImFI2qyoz30e3sn28TCVlq7R\ncKKDsLplyGhKgs97KqfALQIadRgs4w4DQJpophW3o12julZK5lwwVzvYnCZMmFBZWblixYoX\nX3xx8eLFF1xwgdPpfO6554YNG1ZXV9e/f//WS1U0NDREQ6e5udliscyYMePUMhPRNerxeJ5+\n+umnn37a6XRefvnlkydPnjRpUoyzjFWhUGj58uXNzd9a43z58uVr166dP3++JEmLFi3inM+Z\nM+csxw2kOBwiwL1epsmiaIoCvx9ZORoURdpE7Zw0rEVo6GaEUWkimnS4Rqi2Ms3WImzZQV7X\n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\niBBCyKT9B+ZqfG7mDK4WAAAAAElFTkSuQmCC",
      "text/plain": [
       "plot without title"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# 小提琴图\n",
    "words <- ggplot(data, aes(x=Rating, y=words))\n",
    "words + geom_violin(aes(color=Rating)) +\n",
    "        geom_boxplot(width=0.2)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "进一步地，我们综合之前的分位数等统计量，加上核密度估计给出评论字数的小提琴图(violin plot)， 据此可以更加清晰的看出不同观众群体的评论情况。可以看到比较有趣的一点，那就是对本电影评价为“很差”的观众，其评论字数的中位数是最大的。考虑到较大的极差，中位数比均值更加具有说福利，我们有理由认为那些对电影评价不好观众在极力地表达自己的观点:-)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-09-21T11:06:11.652422Z",
     "start_time": "2019-09-21T11:06:07.393Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<!doctype html>\n",
       "<html>\n",
       "\t<head>\n",
       "\t\t<meta charset=\"utf-8\">\n",
       "\t\t<script title=\"htmlwidgets\" src=\"data:application/javascript;base64,KGZ1bmN0aW9uKCkgewogIC8vIElmIHdpbmRvdy5IVE1MV2lkZ2V0cyBpcyBhbHJlYWR5IGRlZmluZWQsIHRoZW4gdXNlIGl0OyBvdGhlcndpc2UgY3JlYXRlIGEKICAvLyBuZXcgb2JqZWN0LiBUaGlzIGFsbG93cyBwcmVjZWRpbmcgY29kZSB0byBzZXQgb3B0aW9ucyB0aGF0IGFmZmVjdCB0aGUKICAvLyBpbml0aWFsaXphdGlvbiBwcm9jZXNzICh0aG91Z2ggbm9uZSBjdXJyZW50bHkgZXhpc3QpLgogIHdpbmRvdy5IVE1MV2lkZ2V0cyA9IHdpbmRvdy5IVE1MV2lkZ2V0cyB8fCB7fTsKCiAgLy8gU2VlIGlmIHdlJ3JlIHJ1bm5pbmcgaW4gYSB2aWV3ZXIgcGFuZS4gSWYgbm90LCB3ZSdyZSBpbiBhIHdlYiBicm93c2VyLgogIHZhciB2aWV3ZXJNb2RlID0gd2luZG93LkhUTUxXaWRnZXRzLnZpZXdlck1vZGUgPQogICAgICAvXGJ2aWV3ZXJfcGFuZT0xXGIvLnRlc3Qod2luZG93LmxvY2F0aW9uKTsKCiAgLy8gU2VlIGlmIHdlJ3JlIHJ1bm5pbmcgaW4gU2hpbnkgbW9kZS4gSWYgbm90LCBpdCdzIGEgc3RhdGljIGRvY3VtZW50LgogIC8vIE5vdGUgdGhhdCBzdGF0aWMgd2lkZ2V0cyBjYW4gYXBwZWFyIGluIGJvdGggU2hpbnkgYW5kIHN0YXRpYyBtb2RlcywgYnV0CiAgLy8gb2J2aW91c2x5LCBTaGlueSB3aWRnZXRzIGNhbiBvbmx5IGFwcGVhciBpbiBTaGlueSBhcHBzL2RvY3VtZW50cy4KICB2YXIgc2hpbnlNb2RlID0gd2luZG93LkhUTUxXaWRnZXRzLnNoaW55TW9kZSA9CiAgICAgIHR5cGVvZih3aW5kb3cuU2hpbnkpICE9PSAidW5kZWZpbmVkIiAmJiAhIXdpbmRvdy5TaGlueS5vdXRwdXRCaW5kaW5nczsKCiAgLy8gV2UgY2FuJ3QgY291bnQgb24galF1ZXJ5IGJlaW5nIGF2YWlsYWJsZSwgc28gd2UgaW1wbGVtZW50IG91ciBvd24KICAvLyB2ZXJzaW9uIGlmIG5lY2Vzc2FyeS4KICBmdW5jdGlvbiBxdWVyeVNlbGVjdG9yQWxsKHNjb3BlLCBzZWxlY3RvcikgewogICAgaWYgKHR5cGVvZihqUXVlcnkpICE9PSAidW5kZWZpbmVkIiAmJiBzY29wZSBpbnN0YW5jZW9mIGpRdWVyeSkgewogICAgICByZXR1cm4gc2NvcGUuZmluZChzZWxlY3Rvcik7CiAgICB9CiAgICBpZiAoc2NvcGUucXVlcnlTZWxlY3RvckFsbCkgewogICAgICByZXR1cm4gc2NvcGUucXVlcnlTZWxlY3RvckFsbChzZWxlY3Rvcik7CiAgICB9CiAgfQoKICBmdW5jdGlvbiBhc0FycmF5KHZhbHVlKSB7CiAgICBpZiAodmFsdWUgPT09IG51bGwpCiAgICAgIHJldHVybiBbXTsKICAgIGlmICgkLmlzQXJyYXkodmFsdWUpKQogICAgICByZXR1cm4gdmFsdWU7CiAgICByZXR1cm4gW3ZhbHVlXTsKICB9CgogIC8vIEltcGxlbWVudCBqUXVlcnkncyBleHRlbmQKICBmdW5jdGlvbiBleHRlbmQodGFyZ2V0IC8qLCAuLi4gKi8pIHsKICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09IDEpIHsKICAgICAgcmV0dXJuIHRhcmdldDsKICAgIH0KICAgIGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7CiAgICAgIHZhciBzb3VyY2UgPSBhcmd1bWVudHNbaV07CiAgICAgIGZvciAodmFyIHByb3AgaW4gc291cmNlKSB7CiAgICAgICAgaWYgKHNvdXJjZS5oYXNPd25Qcm9wZXJ0eShwcm9wKSkgewogICAgICAgICAgdGFyZ2V0W3Byb3BdID0gc291cmNlW3Byb3BdOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgcmV0dXJuIHRhcmdldDsKICB9CgogIC8vIElFOCBkb2Vzbid0IHN1cHBvcnQgQXJyYXkuZm9yRWFjaC4KICBmdW5jdGlvbiBmb3JFYWNoKHZhbHVlcywgY2FsbGJhY2ssIHRoaXNBcmcpIHsKICAgIGlmICh2YWx1ZXMuZm9yRWFjaCkgewogICAgICB2YWx1ZXMuZm9yRWFjaChjYWxsYmFjaywgdGhpc0FyZyk7CiAgICB9IGVsc2UgewogICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHZhbHVlcy5sZW5ndGg7IGkrKykgewogICAgICAgIGNhbGxiYWNrLmNhbGwodGhpc0FyZywgdmFsdWVzW2ldLCBpLCB2YWx1ZXMpOwogICAgICB9CiAgICB9CiAgfQoKICAvLyBSZXBsYWNlcyB0aGUgc3BlY2lmaWVkIG1ldGhvZCB3aXRoIHRoZSByZXR1cm4gdmFsdWUgb2YgZnVuY1NvdXJjZS4KICAvLwogIC8vIE5vdGUgdGhhdCBmdW5jU291cmNlIHNob3VsZCBub3QgQkUgdGhlIG5ldyBtZXRob2QsIGl0IHNob3VsZCBiZSBhIGZ1bmN0aW9uCiAgLy8gdGhhdCBSRVRVUk5TIHRoZSBuZXcgbWV0aG9kLiBmdW5jU291cmNlIHJlY2VpdmVzIGEgc2luZ2xlIGFyZ3VtZW50IHRoYXQgaXMKICAvLyB0aGUgb3ZlcnJpZGRlbiBtZXRob2QsIGl0IGNhbiBiZSBjYWxsZWQgZnJvbSB0aGUgbmV3IG1ldGhvZC4gVGhlIG92ZXJyaWRkZW4KICAvLyBtZXRob2QgY2FuIGJlIGNhbGxlZCBsaWtlIGEgcmVndWxhciBmdW5jdGlvbiwgaXQgaGFzIHRoZSB0YXJnZXQgcGVybWFuZW50bHkKICAvLyBib3VuZCB0byBpdCBzbyAidGhpcyIgd2lsbCB3b3JrIGNvcnJlY3RseS4KICBmdW5jdGlvbiBvdmVycmlkZU1ldGhvZCh0YXJnZXQsIG1ldGhvZE5hbWUsIGZ1bmNTb3VyY2UpIHsKICAgIHZhciBzdXBlckZ1bmMgPSB0YXJnZXRbbWV0aG9kTmFtZV0gfHwgZnVuY3Rpb24oKSB7fTsKICAgIHZhciBzdXBlckZ1bmNCb3VuZCA9IGZ1bmN0aW9uKCkgewogICAgICByZXR1cm4gc3VwZXJGdW5jLmFwcGx5KHRhcmdldCwgYXJndW1lbnRzKTsKICAgIH07CiAgICB0YXJnZXRbbWV0aG9kTmFtZV0gPSBmdW5jU291cmNlKHN1cGVyRnVuY0JvdW5kKTsKICB9CgogIC8vIEFkZCBhIG1ldGhvZCB0byBkZWxlZ2F0b3IgdGhhdCwgd2hlbiBpbnZva2VkLCBjYWxscwogIC8vIGRlbGVnYXRlZS5tZXRob2ROYW1lLiBJZiB0aGVyZSBpcyBubyBzdWNoIG1ldGhvZCBvbgogIC8vIHRoZSBkZWxlZ2F0ZWUsIGJ1dCB0aGVyZSB3YXMgb25lIG9uIGRlbGVnYXRvciBiZWZvcmUKICAvLyBkZWxlZ2F0ZU1ldGhvZCB3YXMgY2FsbGVkLCB0aGVuIHRoZSBvcmlnaW5hbCB2ZXJzaW9uCiAgLy8gaXMgaW52b2tlZCBpbnN0ZWFkLgogIC8vIEZvciBleGFtcGxlOgogIC8vCiAgLy8gdmFyIGEgPSB7CiAgLy8gICBtZXRob2QxOiBmdW5jdGlvbigpIHsgY29uc29sZS5sb2coJ2ExJyk7IH0KICAvLyAgIG1ldGhvZDI6IGZ1bmN0aW9uKCkgeyBjb25zb2xlLmxvZygnYTInKTsgfQogIC8vIH07CiAgLy8gdmFyIGIgPSB7CiAgLy8gICBtZXRob2QxOiBmdW5jdGlvbigpIHsgY29uc29sZS5sb2coJ2IxJyk7IH0KICAvLyB9OwogIC8vIGRlbGVnYXRlTWV0aG9kKGEsIGIsICJtZXRob2QxIik7CiAgLy8gZGVsZWdhdGVNZXRob2QoYSwgYiwgIm1ldGhvZDIiKTsKICAvLyBhLm1ldGhvZDEoKTsKICAvLyBhLm1ldGhvZDIoKTsKICAvLwogIC8vIFRoZSBvdXRwdXQgd291bGQgYmUgImIxIiwgImEyIi4KICBmdW5jdGlvbiBkZWxlZ2F0ZU1ldGhvZChkZWxlZ2F0b3IsIGRlbGVnYXRlZSwgbWV0aG9kTmFtZSkgewogICAgdmFyIGluaGVyaXRlZCA9IGRlbGVnYXRvclttZXRob2ROYW1lXTsKICAgIGRlbGVnYXRvclttZXRob2ROYW1lXSA9IGZ1bmN0aW9uKCkgewogICAgICB2YXIgdGFyZ2V0ID0gZGVsZWdhdGVlOwogICAgICB2YXIgbWV0aG9kID0gZGVsZWdhdGVlW21ldGhvZE5hbWVdOwoKICAgICAgLy8gVGhlIG1ldGhvZCBkb2Vzbid0IGV4aXN0IG9uIHRoZSBkZWxlZ2F0ZWUuIEluc3RlYWQsCiAgICAgIC8vIGNhbGwgdGhlIG1ldGhvZCBvbiB0aGUgZGVsZWdhdG9yLCBpZiBpdCBleGlzdHMuCiAgICAgIGlmICghbWV0aG9kKSB7CiAgICAgICAgdGFyZ2V0ID0gZGVsZWdhdG9yOwogICAgICAgIG1ldGhvZCA9IGluaGVyaXRlZDsKICAgICAgfQoKICAgICAgaWYgKG1ldGhvZCkgewogICAgICAgIHJldHVybiBtZXRob2QuYXBwbHkodGFyZ2V0LCBhcmd1bWVudHMpOwogICAgICB9CiAgICB9OwogIH0KCiAgLy8gSW1wbGVtZW50IGEgdmFndWUgZmFjc2ltaWxpZSBvZiBqUXVlcnkncyBkYXRhIG1ldGhvZAogIGZ1bmN0aW9uIGVsZW1lbnREYXRhKGVsLCBuYW1lLCB2YWx1ZSkgewogICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT0gMikgewogICAgICByZXR1cm4gZWxbImh0bWx3aWRnZXRfZGF0YV8iICsgbmFtZV07CiAgICB9IGVsc2UgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT0gMykgewogICAgICBlbFsiaHRtbHdpZGdldF9kYXRhXyIgKyBuYW1lXSA9IHZhbHVlOwogICAgICByZXR1cm4gZWw7CiAgICB9IGVsc2UgewogICAgICB0aHJvdyBuZXcgRXJyb3IoIldyb25nIG51bWJlciBvZiBhcmd1bWVudHMgZm9yIGVsZW1lbnREYXRhOiAiICsKICAgICAgICBhcmd1bWVudHMubGVuZ3RoKTsKICAgIH0KICB9CgogIC8vIGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvMzQ0NjE3MC9lc2NhcGUtc3RyaW5nLWZvci11c2UtaW4tamF2YXNjcmlwdC1yZWdleAogIGZ1bmN0aW9uIGVzY2FwZVJlZ0V4cChzdHIpIHsKICAgIHJldHVybiBzdHIucmVwbGFjZSgvW1wtXFtcXVwvXHtcfVwoXClcKlwrXD9cLlxcXF5cJFx8XS9nLCAiXFwkJiIpOwogIH0KCiAgZnVuY3Rpb24gaGFzQ2xhc3MoZWwsIGNsYXNzTmFtZSkgewogICAgdmFyIHJlID0gbmV3IFJlZ0V4cCgiXFxiIiArIGVzY2FwZVJlZ0V4cChjbGFzc05hbWUpICsgIlxcYiIpOwogICAgcmV0dXJuIHJlLnRlc3QoZWwuY2xhc3NOYW1lKTsKICB9CgogIC8vIGVsZW1lbnRzIC0gYXJyYXkgKG9yIGFycmF5LWxpa2Ugb2JqZWN0KSBvZiBIVE1MIGVsZW1lbnRzCiAgLy8gY2xhc3NOYW1lIC0gY2xhc3MgbmFtZSB0byB0ZXN0IGZvcgogIC8vIGluY2x1ZGUgLSBpZiB0cnVlLCBvbmx5IHJldHVybiBlbGVtZW50cyB3aXRoIGdpdmVuIGNsYXNzTmFtZTsKICAvLyAgIGlmIGZhbHNlLCBvbmx5IHJldHVybiBlbGVtZW50cyAqd2l0aG91dCogZ2l2ZW4gY2xhc3NOYW1lCiAgZnVuY3Rpb24gZmlsdGVyQnlDbGFzcyhlbGVtZW50cywgY2xhc3NOYW1lLCBpbmNsdWRlKSB7CiAgICB2YXIgcmVzdWx0cyA9IFtdOwogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBlbGVtZW50cy5sZW5ndGg7IGkrKykgewogICAgICBpZiAoaGFzQ2xhc3MoZWxlbWVudHNbaV0sIGNsYXNzTmFtZSkgPT0gaW5jbHVkZSkKICAgICAgICByZXN1bHRzLnB1c2goZWxlbWVudHNbaV0pOwogICAgfQogICAgcmV0dXJuIHJlc3VsdHM7CiAgfQoKICBmdW5jdGlvbiBvbihvYmosIGV2ZW50TmFtZSwgZnVuYykgewogICAgaWYgKG9iai5hZGRFdmVudExpc3RlbmVyKSB7CiAgICAgIG9iai5hZGRFdmVudExpc3RlbmVyKGV2ZW50TmFtZSwgZnVuYywgZmFsc2UpOwogICAgfSBlbHNlIGlmIChvYmouYXR0YWNoRXZlbnQpIHsKICAgICAgb2JqLmF0dGFjaEV2ZW50KGV2ZW50TmFtZSwgZnVuYyk7CiAgICB9CiAgfQoKICBmdW5jdGlvbiBvZmYob2JqLCBldmVudE5hbWUsIGZ1bmMpIHsKICAgIGlmIChvYmoucmVtb3ZlRXZlbnRMaXN0ZW5lcikKICAgICAgb2JqLnJlbW92ZUV2ZW50TGlzdGVuZXIoZXZlbnROYW1lLCBmdW5jLCBmYWxzZSk7CiAgICBlbHNlIGlmIChvYmouZGV0YWNoRXZlbnQpIHsKICAgICAgb2JqLmRldGFjaEV2ZW50KGV2ZW50TmFtZSwgZnVuYyk7CiAgICB9CiAgfQoKICAvLyBUcmFuc2xhdGUgYXJyYXkgb2YgdmFsdWVzIHRvIHRvcC9yaWdodC9ib3R0b20vbGVmdCwgYXMgdXN1YWwgd2l0aAogIC8vIHRoZSAicGFkZGluZyIgQ1NTIHByb3BlcnR5CiAgLy8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQ1NTL3BhZGRpbmcKICBmdW5jdGlvbiB1bnBhY2tQYWRkaW5nKHZhbHVlKSB7CiAgICBpZiAodHlwZW9mKHZhbHVlKSA9PT0gIm51bWJlciIpCiAgICAgIHZhbHVlID0gW3ZhbHVlXTsKICAgIGlmICh2YWx1ZS5sZW5ndGggPT09IDEpIHsKICAgICAgcmV0dXJuIHt0b3A6IHZhbHVlWzBdLCByaWdodDogdmFsdWVbMF0sIGJvdHRvbTogdmFsdWVbMF0sIGxlZnQ6IHZhbHVlWzBdfTsKICAgIH0KICAgIGlmICh2YWx1ZS5sZW5ndGggPT09IDIpIHsKICAgICAgcmV0dXJuIHt0b3A6IHZhbHVlWzBdLCByaWdodDogdmFsdWVbMV0sIGJvdHRvbTogdmFsdWVbMF0sIGxlZnQ6IHZhbHVlWzFdfTsKICAgIH0KICAgIGlmICh2YWx1ZS5sZW5ndGggPT09IDMpIHsKICAgICAgcmV0dXJuIHt0b3A6IHZhbHVlWzBdLCByaWdodDogdmFsdWVbMV0sIGJvdHRvbTogdmFsdWVbMl0sIGxlZnQ6IHZhbHVlWzFdfTsKICAgIH0KICAgIGlmICh2YWx1ZS5sZW5ndGggPT09IDQpIHsKICAgICAgcmV0dXJuIHt0b3A6IHZhbHVlWzBdLCByaWdodDogdmFsdWVbMV0sIGJvdHRvbTogdmFsdWVbMl0sIGxlZnQ6IHZhbHVlWzNdfTsKICAgIH0KICB9CgogIC8vIENvbnZlcnQgYW4gdW5wYWNrZWQgcGFkZGluZyBvYmplY3QgdG8gYSBDU1MgdmFsdWUKICBmdW5jdGlvbiBwYWRkaW5nVG9Dc3MocGFkZGluZ09iaikgewogICAgcmV0dXJuIHBhZGRpbmdPYmoudG9wICsgInB4ICIgKyBwYWRkaW5nT2JqLnJpZ2h0ICsgInB4ICIgKyBwYWRkaW5nT2JqLmJvdHRvbSArICJweCAiICsgcGFkZGluZ09iai5sZWZ0ICsgInB4IjsKICB9CgogIC8vIE1ha2VzIGEgbnVtYmVyIHN1aXRhYmxlIGZvciBDU1MKICBmdW5jdGlvbiBweCh4KSB7CiAgICBpZiAodHlwZW9mKHgpID09PSAibnVtYmVyIikKICAgICAgcmV0dXJuIHggKyAicHgiOwogICAgZWxzZQogICAgICByZXR1cm4geDsKICB9CgogIC8vIFJldHJpZXZlcyBydW50aW1lIHdpZGdldCBzaXppbmcgaW5mb3JtYXRpb24gZm9yIGFuIGVsZW1lbnQuCiAgLy8gVGhlIHJldHVybiB2YWx1ZSBpcyBlaXRoZXIgbnVsbCwgb3IgYW4gb2JqZWN0IHdpdGggZmlsbCwgcGFkZGluZywKICAvLyBkZWZhdWx0V2lkdGgsIGRlZmF1bHRIZWlnaHQgZmllbGRzLgogIGZ1bmN0aW9uIHNpemluZ1BvbGljeShlbCkgewogICAgdmFyIHNpemluZ0VsID0gZG9jdW1lbnQucXVlcnlTZWxlY3Rvcigic2NyaXB0W2RhdGEtZm9yPSciICsgZWwuaWQgKyAiJ11bdHlwZT0nYXBwbGljYXRpb24vaHRtbHdpZGdldC1zaXppbmcnXSIpOwogICAgaWYgKCFzaXppbmdFbCkKICAgICAgcmV0dXJuIG51bGw7CiAgICB2YXIgc3AgPSBKU09OLnBhcnNlKHNpemluZ0VsLnRleHRDb250ZW50IHx8IHNpemluZ0VsLnRleHQgfHwgInt9Iik7CiAgICBpZiAodmlld2VyTW9kZSkgewogICAgICByZXR1cm4gc3Audmlld2VyOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuIHNwLmJyb3dzZXI7CiAgICB9CiAgfQoKICAvLyBAcGFyYW0gdGFza3MgQXJyYXkgb2Ygc3RyaW5ncyAob3IgZmFsc3kgdmFsdWUsIGluIHdoaWNoIGNhc2Ugbm8tb3ApLgogIC8vICAgRWFjaCBlbGVtZW50IG11c3QgYmUgYSB2YWxpZCBKYXZhU2NyaXB0IGV4cHJlc3Npb24gdGhhdCB5aWVsZHMgYQogIC8vICAgZnVuY3Rpb24uIE9yLCBjYW4gYmUgYW4gYXJyYXkgb2Ygb2JqZWN0cyB3aXRoICJjb2RlIiBhbmQgImRhdGEiCiAgLy8gICBwcm9wZXJ0aWVzOyBpbiB0aGlzIGNhc2UsIHRoZSAiY29kZSIgcHJvcGVydHkgc2hvdWxkIGJlIGEgc3RyaW5nCiAgLy8gICBvZiBKUyB0aGF0J3MgYW4gZXhwciB0aGF0IHlpZWxkcyBhIGZ1bmN0aW9uLCBhbmQgImRhdGEiIHNob3VsZCBiZQogIC8vICAgYW4gb2JqZWN0IHRoYXQgd2lsbCBiZSBhZGRlZCBhcyBhbiBhZGRpdGlvbmFsIGFyZ3VtZW50IHdoZW4gdGhhdAogIC8vICAgZnVuY3Rpb24gaXMgY2FsbGVkLgogIC8vIEBwYXJhbSB0YXJnZXQgVGhlIG9iamVjdCB0aGF0IHdpbGwgYmUgInRoaXMiIGZvciBlYWNoIGZ1bmN0aW9uCiAgLy8gICBleGVjdXRpb24uCiAgLy8gQHBhcmFtIGFyZ3MgQXJyYXkgb2YgYXJndW1lbnRzIHRvIGJlIHBhc3NlZCB0byB0aGUgZnVuY3Rpb25zLiAoVGhlCiAgLy8gICBzYW1lIGFyZ3VtZW50cyB3aWxsIGJlIHBhc3NlZCB0byBhbGwgZnVuY3Rpb25zLikKICBmdW5jdGlvbiBldmFsQW5kUnVuKHRhc2tzLCB0YXJnZXQsIGFyZ3MpIHsKICAgIGlmICh0YXNrcykgewogICAgICBmb3JFYWNoKHRhc2tzLCBmdW5jdGlvbih0YXNrKSB7CiAgICAgICAgdmFyIHRoZXNlQXJncyA9IGFyZ3M7CiAgICAgICAgaWYgKHR5cGVvZih0YXNrKSA9PT0gIm9iamVjdCIpIHsKICAgICAgICAgIHRoZXNlQXJncyA9IHRoZXNlQXJncy5jb25jYXQoW3Rhc2suZGF0YV0pOwogICAgICAgICAgdGFzayA9IHRhc2suY29kZTsKICAgICAgICB9CiAgICAgICAgdmFyIHRhc2tGdW5jID0gZXZhbCgiKCIgKyB0YXNrICsgIikiKTsKICAgICAgICBpZiAodHlwZW9mKHRhc2tGdW5jKSAhPT0gImZ1bmN0aW9uIikgewogICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJUYXNrIG11c3QgYmUgYSBmdW5jdGlvbiEgU291cmNlOlxuIiArIHRhc2spOwogICAgICAgIH0KICAgICAgICB0YXNrRnVuYy5hcHBseSh0YXJnZXQsIHRoZXNlQXJncyk7CiAgICAgIH0pOwogICAgfQogIH0KCiAgZnVuY3Rpb24gaW5pdFNpemluZyhlbCkgewogICAgdmFyIHNpemluZyA9IHNpemluZ1BvbGljeShlbCk7CiAgICBpZiAoIXNpemluZykKICAgICAgcmV0dXJuOwoKICAgIHZhciBjZWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiaHRtbHdpZGdldF9jb250YWluZXIiKTsKICAgIGlmICghY2VsKQogICAgICByZXR1cm47CgogICAgaWYgKHR5cGVvZihzaXppbmcucGFkZGluZykgIT09ICJ1bmRlZmluZWQiKSB7CiAgICAgIGRvY3VtZW50LmJvZHkuc3R5bGUubWFyZ2luID0gIjAiOwogICAgICBkb2N1bWVudC5ib2R5LnN0eWxlLnBhZGRpbmcgPSBwYWRkaW5nVG9Dc3ModW5wYWNrUGFkZGluZyhzaXppbmcucGFkZGluZykpOwogICAgfQoKICAgIGlmIChzaXppbmcuZmlsbCkgewogICAgICBkb2N1bWVudC5ib2R5LnN0eWxlLm92ZXJmbG93ID0gImhpZGRlbiI7CiAgICAgIGRvY3VtZW50LmJvZHkuc3R5bGUud2lkdGggPSAiMTAwJSI7CiAgICAgIGRvY3VtZW50LmJvZHkuc3R5bGUuaGVpZ2h0ID0gIjEwMCUiOwogICAgICBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc3R5bGUud2lkdGggPSAiMTAwJSI7CiAgICAgIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zdHlsZS5oZWlnaHQgPSAiMTAwJSI7CiAgICAgIGlmIChjZWwpIHsKICAgICAgICBjZWwuc3R5bGUucG9zaXRpb24gPSAiYWJzb2x1dGUiOwogICAgICAgIHZhciBwYWQgPSB1bnBhY2tQYWRkaW5nKHNpemluZy5wYWRkaW5nKTsKICAgICAgICBjZWwuc3R5bGUudG9wID0gcGFkLnRvcCArICJweCI7CiAgICAgICAgY2VsLnN0eWxlLnJpZ2h0ID0gcGFkLnJpZ2h0ICsgInB4IjsKICAgICAgICBjZWwuc3R5bGUuYm90dG9tID0gcGFkLmJvdHRvbSArICJweCI7CiAgICAgICAgY2VsLnN0eWxlLmxlZnQgPSBwYWQubGVmdCArICJweCI7CiAgICAgICAgZWwuc3R5bGUud2lkdGggPSAiMTAwJSI7CiAgICAgICAgZWwuc3R5bGUuaGVpZ2h0ID0gIjEwMCUiOwogICAgICB9CgogICAgICByZXR1cm4gewogICAgICAgIGdldFdpZHRoOiBmdW5jdGlvbigpIHsgcmV0dXJuIGNlbC5vZmZzZXRXaWR0aDsgfSwKICAgICAgICBnZXRIZWlnaHQ6IGZ1bmN0aW9uKCkgeyByZXR1cm4gY2VsLm9mZnNldEhlaWdodDsgfQogICAgICB9OwoKICAgIH0gZWxzZSB7CiAgICAgIGVsLnN0eWxlLndpZHRoID0gcHgoc2l6aW5nLndpZHRoKTsKICAgICAgZWwuc3R5bGUuaGVpZ2h0ID0gcHgoc2l6aW5nLmhlaWdodCk7CgogICAgICByZXR1cm4gewogICAgICAgIGdldFdpZHRoOiBmdW5jdGlvbigpIHsgcmV0dXJuIGVsLm9mZnNldFdpZHRoOyB9LAogICAgICAgIGdldEhlaWdodDogZnVuY3Rpb24oKSB7IHJldHVybiBlbC5vZmZzZXRIZWlnaHQ7IH0KICAgICAgfTsKICAgIH0KICB9CgogIC8vIERlZmF1bHQgaW1wbGVtZW50YXRpb25zIGZvciBtZXRob2RzCiAgdmFyIGRlZmF1bHRzID0gewogICAgZmluZDogZnVuY3Rpb24oc2NvcGUpIHsKICAgICAgcmV0dXJuIHF1ZXJ5U2VsZWN0b3JBbGwoc2NvcGUsICIuIiArIHRoaXMubmFtZSk7CiAgICB9LAogICAgcmVuZGVyRXJyb3I6IGZ1bmN0aW9uKGVsLCBlcnIpIHsKICAgICAgdmFyICRlbCA9ICQoZWwpOwoKICAgICAgdGhpcy5jbGVhckVycm9yKGVsKTsKCiAgICAgIC8vIEFkZCBhbGwgdGhlc2UgZXJyb3IgY2xhc3NlcywgYXMgU2hpbnkgZG9lcwogICAgICB2YXIgZXJyQ2xhc3MgPSAic2hpbnktb3V0cHV0LWVycm9yIjsKICAgICAgaWYgKGVyci50eXBlICE9PSBudWxsKSB7CiAgICAgICAgLy8gdXNlIHRoZSBjbGFzc2VzIG9mIHRoZSBlcnJvciBjb25kaXRpb24gYXMgQ1NTIGNsYXNzIG5hbWVzCiAgICAgICAgZXJyQ2xhc3MgPSBlcnJDbGFzcyArICIgIiArICQubWFwKGFzQXJyYXkoZXJyLnR5cGUpLCBmdW5jdGlvbih0eXBlKSB7CiAgICAgICAgICByZXR1cm4gZXJyQ2xhc3MgKyAiLSIgKyB0eXBlOwogICAgICAgIH0pLmpvaW4oIiAiKTsKICAgICAgfQogICAgICBlcnJDbGFzcyA9IGVyckNsYXNzICsgIiBodG1sd2lkZ2V0cy1lcnJvciI7CgogICAgICAvLyBJcyBlbCBpbmxpbmUgb3IgYmxvY2s/IElmIGlubGluZSBvciBpbmxpbmUtYmxvY2ssIGp1c3QgZGlzcGxheTpub25lIGl0CiAgICAgIC8vIGFuZCBhZGQgYW4gaW5saW5lIGVycm9yLgogICAgICB2YXIgZGlzcGxheSA9ICRlbC5jc3MoImRpc3BsYXkiKTsKICAgICAgJGVsLmRhdGEoInJlc3RvcmUtZGlzcGxheS1tb2RlIiwgZGlzcGxheSk7CgogICAgICBpZiAoZGlzcGxheSA9PT0gImlubGluZSIgfHwgZGlzcGxheSA9PT0gImlubGluZS1ibG9jayIpIHsKICAgICAgICAkZWwuaGlkZSgpOwogICAgICAgIGlmIChlcnIubWVzc2FnZSAhPT0gIiIpIHsKICAgICAgICAgIHZhciBlcnJvclNwYW4gPSAkKCI8c3Bhbj4iKS5hZGRDbGFzcyhlcnJDbGFzcyk7CiAgICAgICAgICBlcnJvclNwYW4udGV4dChlcnIubWVzc2FnZSk7CiAgICAgICAgICAkZWwuYWZ0ZXIoZXJyb3JTcGFuKTsKICAgICAgICB9CiAgICAgIH0gZWxzZSBpZiAoZGlzcGxheSA9PT0gImJsb2NrIikgewogICAgICAgIC8vIElmIGJsb2NrLCBhZGQgYW4gZXJyb3IganVzdCBhZnRlciB0aGUgZWwsIHNldCB2aXNpYmlsaXR5Om5vbmUgb24gdGhlCiAgICAgICAgLy8gZWwsIGFuZCBwb3NpdGlvbiB0aGUgZXJyb3IgdG8gYmUgb24gdG9wIG9mIHRoZSBlbC4KICAgICAgICAvLyBNYXJrIGl0IHdpdGggYSB1bmlxdWUgSUQgYW5kIENTUyBjbGFzcyBzbyB3ZSBjYW4gcmVtb3ZlIGl0IGxhdGVyLgogICAgICAgICRlbC5jc3MoInZpc2liaWxpdHkiLCAiaGlkZGVuIik7CiAgICAgICAgaWYgKGVyci5tZXNzYWdlICE9PSAiIikgewogICAgICAgICAgdmFyIGVycm9yRGl2ID0gJCgiPGRpdj4iKS5hZGRDbGFzcyhlcnJDbGFzcykuY3NzKCJwb3NpdGlvbiIsICJhYnNvbHV0ZSIpCiAgICAgICAgICAgIC5jc3MoInRvcCIsIGVsLm9mZnNldFRvcCkKICAgICAgICAgICAgLmNzcygibGVmdCIsIGVsLm9mZnNldExlZnQpCiAgICAgICAgICAgIC8vIHNldHRpbmcgd2lkdGggY2FuIHB1c2ggb3V0IHRoZSBwYWdlIHNpemUsIGZvcmNpbmcgb3RoZXJ3aXNlCiAgICAgICAgICAgIC8vIHVubmVjZXNzYXJ5IHNjcm9sbGJhcnMgdG8gYXBwZWFyIGFuZCBtYWtpbmcgaXQgaW1wb3NzaWJsZSBmb3IKICAgICAgICAgICAgLy8gdGhlIGVsZW1lbnQgdG8gc2hyaW5rOyBzbyB1c2UgbWF4LXdpZHRoIGluc3RlYWQKICAgICAgICAgICAgLmNzcygibWF4V2lkdGgiLCBlbC5vZmZzZXRXaWR0aCkKICAgICAgICAgICAgLmNzcygiaGVpZ2h0IiwgZWwub2Zmc2V0SGVpZ2h0KTsKICAgICAgICAgIGVycm9yRGl2LnRleHQoZXJyLm1lc3NhZ2UpOwogICAgICAgICAgJGVsLmFmdGVyKGVycm9yRGl2KTsKCiAgICAgICAgICAvLyBSZWFsbHkgZHVtYiB3YXkgdG8ga2VlcCB0aGUgc2l6ZS9wb3NpdGlvbiBvZiB0aGUgZXJyb3IgaW4gc3luYyB3aXRoCiAgICAgICAgICAvLyB0aGUgcGFyZW50IGVsZW1lbnQgYXMgdGhlIHdpbmRvdyBpcyByZXNpemVkIG9yIHdoYXRldmVyLgogICAgICAgICAgdmFyIGludElkID0gc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIGlmICghZXJyb3JEaXZbMF0ucGFyZW50RWxlbWVudCkgewogICAgICAgICAgICAgIGNsZWFySW50ZXJ2YWwoaW50SWQpOwogICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQogICAgICAgICAgICBlcnJvckRpdgogICAgICAgICAgICAgIC5jc3MoInRvcCIsIGVsLm9mZnNldFRvcCkKICAgICAgICAgICAgICAuY3NzKCJsZWZ0IiwgZWwub2Zmc2V0TGVmdCkKICAgICAgICAgICAgICAuY3NzKCJtYXhXaWR0aCIsIGVsLm9mZnNldFdpZHRoKQogICAgICAgICAgICAgIC5jc3MoImhlaWdodCIsIGVsLm9mZnNldEhlaWdodCk7CiAgICAgICAgICB9LCA1MDApOwogICAgICAgIH0KICAgICAgfQogICAgfSwKICAgIGNsZWFyRXJyb3I6IGZ1bmN0aW9uKGVsKSB7CiAgICAgIHZhciAkZWwgPSAkKGVsKTsKICAgICAgdmFyIGRpc3BsYXkgPSAkZWwuZGF0YSgicmVzdG9yZS1kaXNwbGF5LW1vZGUiKTsKICAgICAgJGVsLmRhdGEoInJlc3RvcmUtZGlzcGxheS1tb2RlIiwgbnVsbCk7CgogICAgICBpZiAoZGlzcGxheSA9PT0gImlubGluZSIgfHwgZGlzcGxheSA9PT0gImlubGluZS1ibG9jayIpIHsKICAgICAgICBpZiAoZGlzcGxheSkKICAgICAgICAgICRlbC5jc3MoImRpc3BsYXkiLCBkaXNwbGF5KTsKICAgICAgICAkKGVsLm5leHRTaWJsaW5nKS5maWx0ZXIoIi5odG1sd2lkZ2V0cy1lcnJvciIpLnJlbW92ZSgpOwogICAgICB9IGVsc2UgaWYgKGRpc3BsYXkgPT09ICJibG9jayIpewogICAgICAgICRlbC5jc3MoInZpc2liaWxpdHkiLCAiaW5oZXJpdCIpOwogICAgICAgICQoZWwubmV4dFNpYmxpbmcpLmZpbHRlcigiLmh0bWx3aWRnZXRzLWVycm9yIikucmVtb3ZlKCk7CiAgICAgIH0KICAgIH0sCiAgICBzaXppbmc6IHt9CiAgfTsKCiAgLy8gQ2FsbGVkIGJ5IHdpZGdldCBiaW5kaW5ncyB0byByZWdpc3RlciBhIG5ldyB0eXBlIG9mIHdpZGdldC4gVGhlIGRlZmluaXRpb24KICAvLyBvYmplY3QgY2FuIGNvbnRhaW4gdGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzOgogIC8vIC0gbmFtZSAocmVxdWlyZWQpIC0gQSBzdHJpbmcgaW5kaWNhdGluZyB0aGUgYmluZGluZyBuYW1lLCB3aGljaCB3aWxsIGJlCiAgLy8gICB1c2VkIGJ5IGRlZmF1bHQgYXMgdGhlIENTUyBjbGFzc25hbWUgdG8gbG9vayBmb3IuCiAgLy8gLSBpbml0aWFsaXplIChvcHRpb25hbCkgLSBBIGZ1bmN0aW9uKGVsKSB0aGF0IHdpbGwgYmUgY2FsbGVkIG9uY2UgcGVyCiAgLy8gICB3aWRnZXQgZWxlbWVudDsgaWYgYSB2YWx1ZSBpcyByZXR1cm5lZCwgaXQgd2lsbCBiZSBwYXNzZWQgYXMgdGhlIHRoaXJkCiAgLy8gICB2YWx1ZSB0byByZW5kZXJWYWx1ZS4KICAvLyAtIHJlbmRlclZhbHVlIChyZXF1aXJlZCkgLSBBIGZ1bmN0aW9uKGVsLCBkYXRhLCBpbml0VmFsdWUpIHRoYXQgd2lsbCBiZQogIC8vICAgY2FsbGVkIHdpdGggZGF0YS4gU3RhdGljIGNvbnRleHRzIHdpbGwgY2F1c2UgdGhpcyB0byBiZSBjYWxsZWQgb25jZSBwZXIKICAvLyAgIGVsZW1lbnQ7IFNoaW55IGFwcHMgd2lsbCBjYXVzZSB0aGlzIHRvIGJlIGNhbGxlZCBtdWx0aXBsZSB0aW1lcyBwZXIKICAvLyAgIGVsZW1lbnQsIGFzIHRoZSBkYXRhIGNoYW5nZXMuCiAgd2luZG93LkhUTUxXaWRnZXRzLndpZGdldCA9IGZ1bmN0aW9uKGRlZmluaXRpb24pIHsKICAgIGlmICghZGVmaW5pdGlvbi5uYW1lKSB7CiAgICAgIHRocm93IG5ldyBFcnJvcigiV2lkZ2V0IG11c3QgaGF2ZSBhIG5hbWUiKTsKICAgIH0KICAgIGlmICghZGVmaW5pdGlvbi50eXBlKSB7CiAgICAgIHRocm93IG5ldyBFcnJvcigiV2lkZ2V0IG11c3QgaGF2ZSBhIHR5cGUiKTsKICAgIH0KICAgIC8vIEN1cnJlbnRseSB3ZSBvbmx5IHN1cHBvcnQgb3V0cHV0IHdpZGdldHMKICAgIGlmIChkZWZpbml0aW9uLnR5cGUgIT09ICJvdXRwdXQiKSB7CiAgICAgIHRocm93IG5ldyBFcnJvcigiVW5yZWNvZ25pemVkIHdpZGdldCB0eXBlICciICsgZGVmaW5pdGlvbi50eXBlICsgIiciKTsKICAgIH0KICAgIC8vIFRPRE86IFZlcmlmeSB0aGF0IC5uYW1lIGlzIGEgdmFsaWQgQ1NTIGNsYXNzbmFtZQoKICAgIC8vIFN1cHBvcnQgbmV3LXN0eWxlIGluc3RhbmNlLWJvdW5kIGRlZmluaXRpb25zLiBPbGQtc3R5bGUgY2xhc3MtYm91bmQKICAgIC8vIGRlZmluaXRpb25zIGhhdmUgb25lIHdpZGdldCAib2JqZWN0IiBwZXIgd2lkZ2V0IHBlciB0eXBlL2NsYXNzIG9mCiAgICAvLyB3aWRnZXQ7IHRoZSByZW5kZXJWYWx1ZSBhbmQgcmVzaXplIG1ldGhvZHMgb24gc3VjaCB3aWRnZXQgb2JqZWN0cwogICAgLy8gdGFrZSBlbCBhbmQgaW5zdGFuY2UgYXJndW1lbnRzLCBiZWNhdXNlIHRoZSB3aWRnZXQgb2JqZWN0IGNhbid0CiAgICAvLyBzdG9yZSB0aGVtLiBOZXctc3R5bGUgaW5zdGFuY2UtYm91bmQgZGVmaW5pdGlvbnMgaGF2ZSBvbmUgd2lkZ2V0CiAgICAvLyBvYmplY3QgcGVyIHdpZGdldCBpbnN0YW5jZTsgdGhlIGRlZmluaXRpb24gdGhhdCdzIHBhc3NlZCBpbiBkb2Vzbid0CiAgICAvLyBwcm92aWRlIHJlbmRlclZhbHVlIG9yIHJlc2l6ZSBtZXRob2RzIGF0IGFsbCwganVzdCB0aGUgc2luZ2xlIG1ldGhvZAogICAgLy8gICBmYWN0b3J5KGVsLCB3aWR0aCwgaGVpZ2h0KQogICAgLy8gd2hpY2ggcmV0dXJucyBhbiBvYmplY3QgdGhhdCBoYXMgcmVuZGVyVmFsdWUoeCkgYW5kIHJlc2l6ZSh3LCBoKS4KICAgIC8vIFRoaXMgZW5hYmxlcyBhIGZhciBtb3JlIG5hdHVyYWwgcHJvZ3JhbW1pbmcgc3R5bGUgZm9yIHRoZSB3aWRnZXQKICAgIC8vIGF1dGhvciwgd2hvIGNhbiBzdG9yZSBwZXItaW5zdGFuY2Ugc3RhdGUgdXNpbmcgZWl0aGVyIE9PLXN0eWxlCiAgICAvLyBpbnN0YW5jZSBmaWVsZHMgb3IgZnVuY3Rpb25hbC1zdHlsZSBjbG9zdXJlIHZhcmlhYmxlcyAoSSBndWVzcyB0aGlzCiAgICAvLyBpcyBpbiBjb250cmFzdCB0byB3aGF0IGNhbiBvbmx5IGJlIGNhbGxlZCBDLXN0eWxlIHBzZXVkby1PTyB3aGljaCBpcwogICAgLy8gd2hhdCB3ZSByZXF1aXJlZCBiZWZvcmUpLgogICAgaWYgKGRlZmluaXRpb24uZmFjdG9yeSkgewogICAgICBkZWZpbml0aW9uID0gY3JlYXRlTGVnYWN5RGVmaW5pdGlvbkFkYXB0ZXIoZGVmaW5pdGlvbik7CiAgICB9CgogICAgaWYgKCFkZWZpbml0aW9uLnJlbmRlclZhbHVlKSB7CiAgICAgIHRocm93IG5ldyBFcnJvcigiV2lkZ2V0IG11c3QgaGF2ZSBhIHJlbmRlclZhbHVlIGZ1bmN0aW9uIik7CiAgICB9CgogICAgLy8gRm9yIHN0YXRpYyByZW5kZXJpbmcgKG5vbi1TaGlueSksIHVzZSBhIHNpbXBsZSB3aWRnZXQgcmVnaXN0cmF0aW9uCiAgICAvLyBzY2hlbWUuIFdlIGFsc28gdXNlIHRoaXMgc2NoZW1lIGZvciBTaGlueSBhcHBzL2RvY3VtZW50cyB0aGF0IGFsc28KICAgIC8vIGNvbnRhaW4gc3RhdGljIHdpZGdldHMuCiAgICB3aW5kb3cuSFRNTFdpZGdldHMud2lkZ2V0cyA9IHdpbmRvdy5IVE1MV2lkZ2V0cy53aWRnZXRzIHx8IFtdOwogICAgLy8gTWVyZ2UgZGVmYXVsdHMgaW50byB0aGUgZGVmaW5pdGlvbjsgZG9uJ3QgbXV0YXRlIHRoZSBvcmlnaW5hbCBkZWZpbml0aW9uLgogICAgdmFyIHN0YXRpY0JpbmRpbmcgPSBleHRlbmQoe30sIGRlZmF1bHRzLCBkZWZpbml0aW9uKTsKICAgIG92ZXJyaWRlTWV0aG9kKHN0YXRpY0JpbmRpbmcsICJmaW5kIiwgZnVuY3Rpb24oc3VwZXJmdW5jKSB7CiAgICAgIHJldHVybiBmdW5jdGlvbihzY29wZSkgewogICAgICAgIHZhciByZXN1bHRzID0gc3VwZXJmdW5jKHNjb3BlKTsKICAgICAgICAvLyBGaWx0ZXIgb3V0IFNoaW55IG91dHB1dHMsIHdlIG9ubHkgd2FudCB0aGUgc3RhdGljIGtpbmQKICAgICAgICByZXR1cm4gZmlsdGVyQnlDbGFzcyhyZXN1bHRzLCAiaHRtbC13aWRnZXQtb3V0cHV0IiwgZmFsc2UpOwogICAgICB9OwogICAgfSk7CiAgICB3aW5kb3cuSFRNTFdpZGdldHMud2lkZ2V0cy5wdXNoKHN0YXRpY0JpbmRpbmcpOwoKICAgIGlmIChzaGlueU1vZGUpIHsKICAgICAgLy8gU2hpbnkgaXMgcnVubmluZy4gUmVnaXN0ZXIgdGhlIGRlZmluaXRpb24gd2l0aCBhbiBvdXRwdXQgYmluZGluZy4KICAgICAgLy8gVGhlIGRlZmluaXRpb24gaXRzZWxmIHdpbGwgbm90IGJlIHRoZSBvdXRwdXQgYmluZGluZywgaW5zdGVhZAogICAgICAvLyB3ZSB3aWxsIG1ha2UgYW4gb3V0cHV0IGJpbmRpbmcgb2JqZWN0IHRoYXQgZGVsZWdhdGVzIHRvIHRoZQogICAgICAvLyBkZWZpbml0aW9uLiBUaGlzIGlzIGJlY2F1c2Ugd2UgZm9vbGlzaGx5IHVzZWQgdGhlIHNhbWUgbWV0aG9kCiAgICAgIC8vIG5hbWUgKHJlbmRlclZhbHVlKSBmb3IgaHRtbHdpZGdldHMgZGVmaW5pdGlvbiBhbmQgU2hpbnkgYmluZGluZ3MKICAgICAgLy8gYnV0IHRoZXkgYWN0dWFsbHkgaGF2ZSBxdWl0ZSBkaWZmZXJlbnQgc2VtYW50aWNzICh0aGUgU2hpbnkKICAgICAgLy8gYmluZGluZ3MgcmVjZWl2ZSBkYXRhIHRoYXQgaW5jbHVkZXMgbG90cyBvZiBtZXRhZGF0YSB0aGF0IGl0CiAgICAgIC8vIHN0cmlwcyBvZmYgYmVmb3JlIGNhbGxpbmcgaHRtbHdpZGdldHMgcmVuZGVyVmFsdWUpLiBXZSBjYW4ndAogICAgICAvLyBqdXN0IGlnbm9yZSB0aGUgZGlmZmVyZW5jZSBiZWNhdXNlIGluIHNvbWUgd2lkZ2V0cyBpdCdzIGhlbHBmdWwKICAgICAgLy8gdG8gY2FsbCB0aGlzLnJlbmRlclZhbHVlKCkgZnJvbSBpbnNpZGUgb2YgcmVzaXplKCksIGFuZCBpZgogICAgICAvLyB3ZSdyZSBub3QgZGVsZWdhdGluZywgdGhlbiB0aGF0IGNhbGwgd2lsbCBnbyB0byB0aGUgU2hpbnkKICAgICAgLy8gdmVyc2lvbiBpbnN0ZWFkIG9mIHRoZSBodG1sd2lkZ2V0cyB2ZXJzaW9uLgoKICAgICAgLy8gTWVyZ2UgZGVmYXVsdHMgd2l0aCBkZWZpbml0aW9uLCB3aXRob3V0IG11dGF0aW5nIGVpdGhlci4KICAgICAgdmFyIGJpbmRpbmdEZWYgPSBleHRlbmQoe30sIGRlZmF1bHRzLCBkZWZpbml0aW9uKTsKCiAgICAgIC8vIFRoaXMgb2JqZWN0IHdpbGwgYmUgb3VyIGFjdHVhbCBTaGlueSBiaW5kaW5nLgogICAgICB2YXIgc2hpbnlCaW5kaW5nID0gbmV3IFNoaW55Lk91dHB1dEJpbmRpbmcoKTsKCiAgICAgIC8vIFdpdGggYSBmZXcgZXhjZXB0aW9ucywgd2UnbGwgd2FudCB0byBzaW1wbHkgdXNlIHRoZSBiaW5kaW5nRGVmJ3MKICAgICAgLy8gdmVyc2lvbiBvZiBtZXRob2RzIGlmIHRoZXkgYXJlIGF2YWlsYWJsZSwgb3RoZXJ3aXNlIGZhbGwgYmFjayB0bwogICAgICAvLyBTaGlueSdzIGRlZmF1bHRzLiBOT1RFOiBJZiBTaGlueSdzIG91dHB1dCBiaW5kaW5ncyBnYWluIGFkZGl0aW9uYWwKICAgICAgLy8gbWV0aG9kcyBpbiB0aGUgZnV0dXJlLCBhbmQgd2Ugd2FudCB0aGVtIHRvIGJlIG92ZXJyaWRlYWJsZSBieQogICAgICAvLyBIVE1MV2lkZ2V0IGJpbmRpbmcgZGVmaW5pdGlvbnMsIHRoZW4gd2UnbGwgbmVlZCB0byBhZGQgdGhlbSB0byB0aGlzCiAgICAgIC8vIGxpc3QuCiAgICAgIGRlbGVnYXRlTWV0aG9kKHNoaW55QmluZGluZywgYmluZGluZ0RlZiwgImdldElkIik7CiAgICAgIGRlbGVnYXRlTWV0aG9kKHNoaW55QmluZGluZywgYmluZGluZ0RlZiwgIm9uVmFsdWVDaGFuZ2UiKTsKICAgICAgZGVsZWdhdGVNZXRob2Qoc2hpbnlCaW5kaW5nLCBiaW5kaW5nRGVmLCAib25WYWx1ZUVycm9yIik7CiAgICAgIGRlbGVnYXRlTWV0aG9kKHNoaW55QmluZGluZywgYmluZGluZ0RlZiwgInJlbmRlckVycm9yIik7CiAgICAgIGRlbGVnYXRlTWV0aG9kKHNoaW55QmluZGluZywgYmluZGluZ0RlZiwgImNsZWFyRXJyb3IiKTsKICAgICAgZGVsZWdhdGVNZXRob2Qoc2hpbnlCaW5kaW5nLCBiaW5kaW5nRGVmLCAic2hvd1Byb2dyZXNzIik7CgogICAgICAvLyBUaGUgZmluZCwgcmVuZGVyVmFsdWUsIGFuZCByZXNpemUgYXJlIGhhbmRsZWQgZGlmZmVyZW50bHksIGJlY2F1c2Ugd2UKICAgICAgLy8gd2FudCB0byBhY3R1YWxseSBkZWNvcmF0ZSB0aGUgYmVoYXZpb3Igb2YgdGhlIGJpbmRpbmdEZWYgbWV0aG9kcy4KCiAgICAgIHNoaW55QmluZGluZy5maW5kID0gZnVuY3Rpb24oc2NvcGUpIHsKICAgICAgICB2YXIgcmVzdWx0cyA9IGJpbmRpbmdEZWYuZmluZChzY29wZSk7CgogICAgICAgIC8vIE9ubHkgcmV0dXJuIGVsZW1lbnRzIHRoYXQgYXJlIFNoaW55IG91dHB1dHMsIG5vdCBzdGF0aWMgb25lcwogICAgICAgIHZhciBkeW5hbWljUmVzdWx0cyA9IHJlc3VsdHMuZmlsdGVyKCIuaHRtbC13aWRnZXQtb3V0cHV0Iik7CgogICAgICAgIC8vIEl0J3MgcG9zc2libGUgdGhhdCB3aGF0ZXZlciBjYXVzZWQgU2hpbnkgdG8gdGhpbmsgdGhlcmUgbWlnaHQgYmUKICAgICAgICAvLyBuZXcgZHluYW1pYyBvdXRwdXRzLCBhbHNvIGNhdXNlZCB0aGVyZSB0byBiZSBuZXcgc3RhdGljIG91dHB1dHMuCiAgICAgICAgLy8gU2luY2UgdGhlcmUgbWlnaHQgYmUgbG90cyBvZiBkaWZmZXJlbnQgaHRtbHdpZGdldHMgYmluZGluZ3MsIHdlCiAgICAgICAgLy8gc2NoZWR1bGUgZXhlY3V0aW9uIGZvciBsYXRlci0tbm8gbmVlZCB0byBzdGF0aWNSZW5kZXIgbXVsdGlwbGUKICAgICAgICAvLyB0aW1lcy4KICAgICAgICBpZiAocmVzdWx0cy5sZW5ndGggIT09IGR5bmFtaWNSZXN1bHRzLmxlbmd0aCkKICAgICAgICAgIHNjaGVkdWxlU3RhdGljUmVuZGVyKCk7CgogICAgICAgIHJldHVybiBkeW5hbWljUmVzdWx0czsKICAgICAgfTsKCiAgICAgIC8vIFdyYXAgcmVuZGVyVmFsdWUgdG8gaGFuZGxlIGluaXRpYWxpemF0aW9uLCB3aGljaCB1bmZvcnR1bmF0ZWx5IGlzbid0CiAgICAgIC8vIHN1cHBvcnRlZCBuYXRpdmVseSBieSBTaGlueSBhdCB0aGUgdGltZSBvZiB0aGlzIHdyaXRpbmcuCgogICAgICBzaGlueUJpbmRpbmcucmVuZGVyVmFsdWUgPSBmdW5jdGlvbihlbCwgZGF0YSkgewogICAgICAgIFNoaW55LnJlbmRlckRlcGVuZGVuY2llcyhkYXRhLmRlcHMpOwogICAgICAgIC8vIFJlc29sdmUgc3RyaW5ncyBtYXJrZWQgYXMgamF2YXNjcmlwdCBsaXRlcmFscyB0byBvYmplY3RzCiAgICAgICAgaWYgKCEoZGF0YS5ldmFscyBpbnN0YW5jZW9mIEFycmF5KSkgZGF0YS5ldmFscyA9IFtkYXRhLmV2YWxzXTsKICAgICAgICBmb3IgKHZhciBpID0gMDsgZGF0YS5ldmFscyAmJiBpIDwgZGF0YS5ldmFscy5sZW5ndGg7IGkrKykgewogICAgICAgICAgd2luZG93LkhUTUxXaWRnZXRzLmV2YWx1YXRlU3RyaW5nTWVtYmVyKGRhdGEueCwgZGF0YS5ldmFsc1tpXSk7CiAgICAgICAgfQogICAgICAgIGlmICghYmluZGluZ0RlZi5yZW5kZXJPbk51bGxWYWx1ZSkgewogICAgICAgICAgaWYgKGRhdGEueCA9PT0gbnVsbCkgewogICAgICAgICAgICBlbC5zdHlsZS52aXNpYmlsaXR5ID0gImhpZGRlbiI7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGVsLnN0eWxlLnZpc2liaWxpdHkgPSAiaW5oZXJpdCI7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmICghZWxlbWVudERhdGEoZWwsICJpbml0aWFsaXplZCIpKSB7CiAgICAgICAgICBpbml0U2l6aW5nKGVsKTsKCiAgICAgICAgICBlbGVtZW50RGF0YShlbCwgImluaXRpYWxpemVkIiwgdHJ1ZSk7CiAgICAgICAgICBpZiAoYmluZGluZ0RlZi5pbml0aWFsaXplKSB7CiAgICAgICAgICAgIHZhciByZXN1bHQgPSBiaW5kaW5nRGVmLmluaXRpYWxpemUoZWwsIGVsLm9mZnNldFdpZHRoLAogICAgICAgICAgICAgIGVsLm9mZnNldEhlaWdodCk7CiAgICAgICAgICAgIGVsZW1lbnREYXRhKGVsLCAiaW5pdF9yZXN1bHQiLCByZXN1bHQpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBiaW5kaW5nRGVmLnJlbmRlclZhbHVlKGVsLCBkYXRhLngsIGVsZW1lbnREYXRhKGVsLCAiaW5pdF9yZXN1bHQiKSk7CiAgICAgICAgZXZhbEFuZFJ1bihkYXRhLmpzSG9va3MucmVuZGVyLCBlbGVtZW50RGF0YShlbCwgImluaXRfcmVzdWx0IiksIFtlbCwgZGF0YS54XSk7CiAgICAgIH07CgogICAgICAvLyBPbmx5IG92ZXJyaWRlIHJlc2l6ZSBpZiBiaW5kaW5nRGVmIGltcGxlbWVudHMgaXQKICAgICAgaWYgKGJpbmRpbmdEZWYucmVzaXplKSB7CiAgICAgICAgc2hpbnlCaW5kaW5nLnJlc2l6ZSA9IGZ1bmN0aW9uKGVsLCB3aWR0aCwgaGVpZ2h0KSB7CiAgICAgICAgICAvLyBTaGlueSBjYW4gY2FsbCByZXNpemUgYmVmb3JlIGluaXRpYWxpemUvcmVuZGVyVmFsdWUgaGF2ZSBiZWVuCiAgICAgICAgICAvLyBjYWxsZWQsIHdoaWNoIGRvZXNuJ3QgbWFrZSBzZW5zZSBmb3Igd2lkZ2V0cy4KICAgICAgICAgIGlmIChlbGVtZW50RGF0YShlbCwgImluaXRpYWxpemVkIikpIHsKICAgICAgICAgICAgYmluZGluZ0RlZi5yZXNpemUoZWwsIHdpZHRoLCBoZWlnaHQsIGVsZW1lbnREYXRhKGVsLCAiaW5pdF9yZXN1bHQiKSk7CiAgICAgICAgICB9CiAgICAgICAgfTsKICAgICAgfQoKICAgICAgU2hpbnkub3V0cHV0QmluZGluZ3MucmVnaXN0ZXIoc2hpbnlCaW5kaW5nLCBiaW5kaW5nRGVmLm5hbWUpOwogICAgfQogIH07CgogIHZhciBzY2hlZHVsZVN0YXRpY1JlbmRlclRpbWVySWQgPSBudWxsOwogIGZ1bmN0aW9uIHNjaGVkdWxlU3RhdGljUmVuZGVyKCkgewogICAgaWYgKCFzY2hlZHVsZVN0YXRpY1JlbmRlclRpbWVySWQpIHsKICAgICAgc2NoZWR1bGVTdGF0aWNSZW5kZXJUaW1lcklkID0gc2V0VGltZW91dChmdW5jdGlvbigpIHsKICAgICAgICBzY2hlZHVsZVN0YXRpY1JlbmRlclRpbWVySWQgPSBudWxsOwogICAgICAgIHdpbmRvdy5IVE1MV2lkZ2V0cy5zdGF0aWNSZW5kZXIoKTsKICAgICAgfSwgMSk7CiAgICB9CiAgfQoKICAvLyBSZW5kZXIgc3RhdGljIHdpZGdldHMgYWZ0ZXIgdGhlIGRvY3VtZW50IGZpbmlzaGVzIGxvYWRpbmcKICAvLyBTdGF0aWNhbGx5IHJlbmRlciBhbGwgZWxlbWVudHMgdGhhdCBhcmUgb2YgdGhpcyB3aWRnZXQncyBjbGFzcwogIHdpbmRvdy5IVE1MV2lkZ2V0cy5zdGF0aWNSZW5kZXIgPSBmdW5jdGlvbigpIHsKICAgIHZhciBiaW5kaW5ncyA9IHdpbmRvdy5IVE1MV2lkZ2V0cy53aWRnZXRzIHx8IFtdOwogICAgZm9yRWFjaChiaW5kaW5ncywgZnVuY3Rpb24oYmluZGluZykgewogICAgICB2YXIgbWF0Y2hlcyA9IGJpbmRpbmcuZmluZChkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQpOwogICAgICBmb3JFYWNoKG1hdGNoZXMsIGZ1bmN0aW9uKGVsKSB7CiAgICAgICAgdmFyIHNpemVPYmogPSBpbml0U2l6aW5nKGVsLCBiaW5kaW5nKTsKCiAgICAgICAgaWYgKGhhc0NsYXNzKGVsLCAiaHRtbC13aWRnZXQtc3RhdGljLWJvdW5kIikpCiAgICAgICAgICByZXR1cm47CiAgICAgICAgZWwuY2xhc3NOYW1lID0gZWwuY2xhc3NOYW1lICsgIiBodG1sLXdpZGdldC1zdGF0aWMtYm91bmQiOwoKICAgICAgICB2YXIgaW5pdFJlc3VsdDsKICAgICAgICBpZiAoYmluZGluZy5pbml0aWFsaXplKSB7CiAgICAgICAgICBpbml0UmVzdWx0ID0gYmluZGluZy5pbml0aWFsaXplKGVsLAogICAgICAgICAgICBzaXplT2JqID8gc2l6ZU9iai5nZXRXaWR0aCgpIDogZWwub2Zmc2V0V2lkdGgsCiAgICAgICAgICAgIHNpemVPYmogPyBzaXplT2JqLmdldEhlaWdodCgpIDogZWwub2Zmc2V0SGVpZ2h0CiAgICAgICAgICApOwogICAgICAgICAgZWxlbWVudERhdGEoZWwsICJpbml0X3Jlc3VsdCIsIGluaXRSZXN1bHQpOwogICAgICAgIH0KCiAgICAgICAgaWYgKGJpbmRpbmcucmVzaXplKSB7CiAgICAgICAgICB2YXIgbGFzdFNpemUgPSB7CiAgICAgICAgICAgIHc6IHNpemVPYmogPyBzaXplT2JqLmdldFdpZHRoKCkgOiBlbC5vZmZzZXRXaWR0aCwKICAgICAgICAgICAgaDogc2l6ZU9iaiA/IHNpemVPYmouZ2V0SGVpZ2h0KCkgOiBlbC5vZmZzZXRIZWlnaHQKICAgICAgICAgIH07CiAgICAgICAgICB2YXIgcmVzaXplSGFuZGxlciA9IGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgdmFyIHNpemUgPSB7CiAgICAgICAgICAgICAgdzogc2l6ZU9iaiA/IHNpemVPYmouZ2V0V2lkdGgoKSA6IGVsLm9mZnNldFdpZHRoLAogICAgICAgICAgICAgIGg6IHNpemVPYmogPyBzaXplT2JqLmdldEhlaWdodCgpIDogZWwub2Zmc2V0SGVpZ2h0CiAgICAgICAgICAgIH07CiAgICAgICAgICAgIGlmIChzaXplLncgPT09IDAgJiYgc2l6ZS5oID09PSAwKQogICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgaWYgKHNpemUudyA9PT0gbGFzdFNpemUudyAmJiBzaXplLmggPT09IGxhc3RTaXplLmgpCiAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICBsYXN0U2l6ZSA9IHNpemU7CiAgICAgICAgICAgIGJpbmRpbmcucmVzaXplKGVsLCBzaXplLncsIHNpemUuaCwgaW5pdFJlc3VsdCk7CiAgICAgICAgICB9OwoKICAgICAgICAgIG9uKHdpbmRvdywgInJlc2l6ZSIsIHJlc2l6ZUhhbmRsZXIpOwoKICAgICAgICAgIC8vIFRoaXMgaXMgbmVlZGVkIGZvciBjYXNlcyB3aGVyZSB3ZSdyZSBydW5uaW5nIGluIGEgU2hpbnkKICAgICAgICAgIC8vIGFwcCwgYnV0IHRoZSB3aWRnZXQgaXRzZWxmIGlzIG5vdCBhIFNoaW55IG91dHB1dCwgYnV0CiAgICAgICAgICAvLyByYXRoZXIgYSBzaW1wbGUgc3RhdGljIHdpZGdldC4gT25lIGV4YW1wbGUgb2YgdGhpcyBpcwogICAgICAgICAgLy8gYW4gcm1hcmtkb3duIGRvY3VtZW50IHRoYXQgaGFzIHJ1bnRpbWU6c2hpbnkgYW5kIHdpZGdldAogICAgICAgICAgLy8gdGhhdCBpc24ndCBpbiBhIHJlbmRlciBmdW5jdGlvbi4gU2hpbnkgb25seSBrbm93cyB0bwogICAgICAgICAgLy8gY2FsbCByZXNpemUgaGFuZGxlcnMgZm9yIFNoaW55IG91dHB1dHMsIG5vdCBmb3Igc3RhdGljCiAgICAgICAgICAvLyB3aWRnZXRzLCBzbyB3ZSBkbyBpdCBvdXJzZWx2ZXMuCiAgICAgICAgICBpZiAod2luZG93LmpRdWVyeSkgewogICAgICAgICAgICB3aW5kb3cualF1ZXJ5KGRvY3VtZW50KS5vbigKICAgICAgICAgICAgICAic2hvd24uaHRtbHdpZGdldHMgc2hvd24uYnMudGFiLmh0bWx3aWRnZXRzIHNob3duLmJzLmNvbGxhcHNlLmh0bWx3aWRnZXRzIiwKICAgICAgICAgICAgICByZXNpemVIYW5kbGVyCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHdpbmRvdy5qUXVlcnkoZG9jdW1lbnQpLm9uKAogICAgICAgICAgICAgICJoaWRkZW4uaHRtbHdpZGdldHMgaGlkZGVuLmJzLnRhYi5odG1sd2lkZ2V0cyBoaWRkZW4uYnMuY29sbGFwc2UuaHRtbHdpZGdldHMiLAogICAgICAgICAgICAgIHJlc2l6ZUhhbmRsZXIKICAgICAgICAgICAgKTsKICAgICAgICAgIH0KCiAgICAgICAgICAvLyBUaGlzIGlzIG5lZWRlZCBmb3IgdGhlIHNwZWNpZmljIGNhc2Ugb2YgaW9zbGlkZXMsIHdoaWNoCiAgICAgICAgICAvLyBmbGlwcyBzbGlkZXMgYmV0d2VlbiBkaXNwbGF5Om5vbmUgYW5kIGRpc3BsYXk6YmxvY2suCiAgICAgICAgICAvLyBJZGVhbGx5IHdlIHdvdWxkIG5vdCBoYXZlIHRvIGhhdmUgaW9zbGlkZS1zcGVjaWZpYyBjb2RlCiAgICAgICAgICAvLyBoZXJlLCBidXQgcmF0aGVyIGhhdmUgaW9zbGlkZXMgcmFpc2UgYSBnZW5lcmljIGV2ZW50LAogICAgICAgICAgLy8gYnV0IHRoZSBybWFya2Rvd24gcGFja2FnZSBqdXN0IHdlbnQgdG8gQ1JBTiBzbyB0aGUKICAgICAgICAgIC8vIHdpbmRvdyB0byBnZXR0aW5nIHRoYXQgZml4ZWQgbWF5IGJlIGxvbmcuCiAgICAgICAgICBpZiAod2luZG93LmFkZEV2ZW50TGlzdGVuZXIpIHsKICAgICAgICAgICAgLy8gSXQncyBPSyB0byBsaW1pdCB0aGlzIHRvIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyCiAgICAgICAgICAgIC8vIGJyb3dzZXJzIGJlY2F1c2UgaW9zbGlkZXMgaXRzZWxmIG9ubHkgc3VwcG9ydHMKICAgICAgICAgICAgLy8gc3VjaCBicm93c2Vycy4KICAgICAgICAgICAgb24oZG9jdW1lbnQsICJzbGlkZWVudGVyIiwgcmVzaXplSGFuZGxlcik7CiAgICAgICAgICAgIG9uKGRvY3VtZW50LCAic2xpZGVsZWF2ZSIsIHJlc2l6ZUhhbmRsZXIpOwogICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgdmFyIHNjcmlwdERhdGEgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCJzY3JpcHRbZGF0YS1mb3I9JyIgKyBlbC5pZCArICInXVt0eXBlPSdhcHBsaWNhdGlvbi9qc29uJ10iKTsKICAgICAgICBpZiAoc2NyaXB0RGF0YSkgewogICAgICAgICAgdmFyIGRhdGEgPSBKU09OLnBhcnNlKHNjcmlwdERhdGEudGV4dENvbnRlbnQgfHwgc2NyaXB0RGF0YS50ZXh0KTsKICAgICAgICAgIC8vIFJlc29sdmUgc3RyaW5ncyBtYXJrZWQgYXMgamF2YXNjcmlwdCBsaXRlcmFscyB0byBvYmplY3RzCiAgICAgICAgICBpZiAoIShkYXRhLmV2YWxzIGluc3RhbmNlb2YgQXJyYXkpKSBkYXRhLmV2YWxzID0gW2RhdGEuZXZhbHNdOwogICAgICAgICAgZm9yICh2YXIgayA9IDA7IGRhdGEuZXZhbHMgJiYgayA8IGRhdGEuZXZhbHMubGVuZ3RoOyBrKyspIHsKICAgICAgICAgICAgd2luZG93LkhUTUxXaWRnZXRzLmV2YWx1YXRlU3RyaW5nTWVtYmVyKGRhdGEueCwgZGF0YS5ldmFsc1trXSk7CiAgICAgICAgICB9CiAgICAgICAgICBiaW5kaW5nLnJlbmRlclZhbHVlKGVsLCBkYXRhLngsIGluaXRSZXN1bHQpOwogICAgICAgICAgZXZhbEFuZFJ1bihkYXRhLmpzSG9va3MucmVuZGVyLCBpbml0UmVzdWx0LCBbZWwsIGRhdGEueF0pOwogICAgICAgIH0KICAgICAgfSk7CiAgICB9KTsKCiAgICBpbnZva2VQb3N0UmVuZGVySGFuZGxlcnMoKTsKICB9CgogIC8vIFdhaXQgdW50aWwgYWZ0ZXIgdGhlIGRvY3VtZW50IGhhcyBsb2FkZWQgdG8gcmVuZGVyIHRoZSB3aWRnZXRzLgogIGlmIChkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKSB7CiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJET01Db250ZW50TG9hZGVkIiwgZnVuY3Rpb24oKSB7CiAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoIkRPTUNvbnRlbnRMb2FkZWQiLCBhcmd1bWVudHMuY2FsbGVlLCBmYWxzZSk7CiAgICAgIHdpbmRvdy5IVE1MV2lkZ2V0cy5zdGF0aWNSZW5kZXIoKTsKICAgIH0sIGZhbHNlKTsKICB9IGVsc2UgaWYgKGRvY3VtZW50LmF0dGFjaEV2ZW50KSB7CiAgICBkb2N1bWVudC5hdHRhY2hFdmVudCgib25yZWFkeXN0YXRlY2hhbmdlIiwgZnVuY3Rpb24oKSB7CiAgICAgIGlmIChkb2N1bWVudC5yZWFkeVN0YXRlID09PSAiY29tcGxldGUiKSB7CiAgICAgICAgZG9jdW1lbnQuZGV0YWNoRXZlbnQoIm9ucmVhZHlzdGF0ZWNoYW5nZSIsIGFyZ3VtZW50cy5jYWxsZWUpOwogICAgICAgIHdpbmRvdy5IVE1MV2lkZ2V0cy5zdGF0aWNSZW5kZXIoKTsKICAgICAgfQogICAgfSk7CiAgfQoKCiAgd2luZG93LkhUTUxXaWRnZXRzLmdldEF0dGFjaG1lbnRVcmwgPSBmdW5jdGlvbihkZXBuYW1lLCBrZXkpIHsKICAgIC8vIElmIG5vIGtleSwgZGVmYXVsdCB0byB0aGUgZmlyc3QgaXRlbQogICAgaWYgKHR5cGVvZihrZXkpID09PSAidW5kZWZpbmVkIikKICAgICAga2V5ID0gMTsKCiAgICB2YXIgbGluayA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGRlcG5hbWUgKyAiLSIgKyBrZXkgKyAiLWF0dGFjaG1lbnQiKTsKICAgIGlmICghbGluaykgewogICAgICB0aHJvdyBuZXcgRXJyb3IoIkF0dGFjaG1lbnQgIiArIGRlcG5hbWUgKyAiLyIgKyBrZXkgKyAiIG5vdCBmb3VuZCBpbiBkb2N1bWVudCIpOwogICAgfQogICAgcmV0dXJuIGxpbmsuZ2V0QXR0cmlidXRlKCJocmVmIik7CiAgfTsKCiAgd2luZG93LkhUTUxXaWRnZXRzLmRhdGFmcmFtZVRvRDMgPSBmdW5jdGlvbihkZikgewogICAgdmFyIG5hbWVzID0gW107CiAgICB2YXIgbGVuZ3RoOwogICAgZm9yICh2YXIgbmFtZSBpbiBkZikgewogICAgICAgIGlmIChkZi5oYXNPd25Qcm9wZXJ0eShuYW1lKSkKICAgICAgICAgICAgbmFtZXMucHVzaChuYW1lKTsKICAgICAgICBpZiAodHlwZW9mKGRmW25hbWVdKSAhPT0gIm9iamVjdCIgfHwgdHlwZW9mKGRmW25hbWVdLmxlbmd0aCkgPT09ICJ1bmRlZmluZWQiKSB7CiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigiQWxsIGZpZWxkcyBtdXN0IGJlIGFycmF5cyIpOwogICAgICAgIH0gZWxzZSBpZiAodHlwZW9mKGxlbmd0aCkgIT09ICJ1bmRlZmluZWQiICYmIGxlbmd0aCAhPT0gZGZbbmFtZV0ubGVuZ3RoKSB7CiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigiQWxsIGZpZWxkcyBtdXN0IGJlIGFycmF5cyBvZiB0aGUgc2FtZSBsZW5ndGgiKTsKICAgICAgICB9CiAgICAgICAgbGVuZ3RoID0gZGZbbmFtZV0ubGVuZ3RoOwogICAgfQogICAgdmFyIHJlc3VsdHMgPSBbXTsKICAgIHZhciBpdGVtOwogICAgZm9yICh2YXIgcm93ID0gMDsgcm93IDwgbGVuZ3RoOyByb3crKykgewogICAgICAgIGl0ZW0gPSB7fTsKICAgICAgICBmb3IgKHZhciBjb2wgPSAwOyBjb2wgPCBuYW1lcy5sZW5ndGg7IGNvbCsrKSB7CiAgICAgICAgICAgIGl0ZW1bbmFtZXNbY29sXV0gPSBkZltuYW1lc1tjb2xdXVtyb3ddOwogICAgICAgIH0KICAgICAgICByZXN1bHRzLnB1c2goaXRlbSk7CiAgICB9CiAgICByZXR1cm4gcmVzdWx0czsKICB9OwoKICB3aW5kb3cuSFRNTFdpZGdldHMudHJhbnNwb3NlQXJyYXkyRCA9IGZ1bmN0aW9uKGFycmF5KSB7CiAgICAgIGlmIChhcnJheS5sZW5ndGggPT09IDApIHJldHVybiBhcnJheTsKICAgICAgdmFyIG5ld0FycmF5ID0gYXJyYXlbMF0ubWFwKGZ1bmN0aW9uKGNvbCwgaSkgewogICAgICAgICAgcmV0dXJuIGFycmF5Lm1hcChmdW5jdGlvbihyb3cpIHsKICAgICAgICAgICAgICByZXR1cm4gcm93W2ldCiAgICAgICAgICB9KQogICAgICB9KTsKICAgICAgcmV0dXJuIG5ld0FycmF5OwogIH07CiAgLy8gU3BsaXQgdmFsdWUgYXQgc3BsaXRDaGFyLCBidXQgYWxsb3cgc3BsaXRDaGFyIHRvIGJlIGVzY2FwZWQKICAvLyB1c2luZyBlc2NhcGVDaGFyLiBBbnkgb3RoZXIgY2hhcmFjdGVycyBlc2NhcGVkIGJ5IGVzY2FwZUNoYXIKICAvLyB3aWxsIGJlIGluY2x1ZGVkIGFzIHVzdWFsIChpbmNsdWRpbmcgZXNjYXBlQ2hhciBpdHNlbGYpLgogIGZ1bmN0aW9uIHNwbGl0V2l0aEVzY2FwZSh2YWx1ZSwgc3BsaXRDaGFyLCBlc2NhcGVDaGFyKSB7CiAgICB2YXIgcmVzdWx0cyA9IFtdOwogICAgdmFyIGVzY2FwZU1vZGUgPSBmYWxzZTsKICAgIHZhciBjdXJyZW50UmVzdWx0ID0gIiI7CiAgICBmb3IgKHZhciBwb3MgPSAwOyBwb3MgPCB2YWx1ZS5sZW5ndGg7IHBvcysrKSB7CiAgICAgIGlmICghZXNjYXBlTW9kZSkgewogICAgICAgIGlmICh2YWx1ZVtwb3NdID09PSBzcGxpdENoYXIpIHsKICAgICAgICAgIHJlc3VsdHMucHVzaChjdXJyZW50UmVzdWx0KTsKICAgICAgICAgIGN1cnJlbnRSZXN1bHQgPSAiIjsKICAgICAgICB9IGVsc2UgaWYgKHZhbHVlW3Bvc10gPT09IGVzY2FwZUNoYXIpIHsKICAgICAgICAgIGVzY2FwZU1vZGUgPSB0cnVlOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBjdXJyZW50UmVzdWx0ICs9IHZhbHVlW3Bvc107CiAgICAgICAgfQogICAgICB9IGVsc2UgewogICAgICAgIGN1cnJlbnRSZXN1bHQgKz0gdmFsdWVbcG9zXTsKICAgICAgICBlc2NhcGVNb2RlID0gZmFsc2U7CiAgICAgIH0KICAgIH0KICAgIGlmIChjdXJyZW50UmVzdWx0ICE9PSAiIikgewogICAgICByZXN1bHRzLnB1c2goY3VycmVudFJlc3VsdCk7CiAgICB9CiAgICByZXR1cm4gcmVzdWx0czsKICB9CiAgLy8gRnVuY3Rpb24gYXV0aG9yZWQgYnkgWWlodWkvSkogQWxsYWlyZQogIHdpbmRvdy5IVE1MV2lkZ2V0cy5ldmFsdWF0ZVN0cmluZ01lbWJlciA9IGZ1bmN0aW9uKG8sIG1lbWJlcikgewogICAgdmFyIHBhcnRzID0gc3BsaXRXaXRoRXNjYXBlKG1lbWJlciwgJy4nLCAnXFwnKTsKICAgIGZvciAodmFyIGkgPSAwLCBsID0gcGFydHMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7CiAgICAgIHZhciBwYXJ0ID0gcGFydHNbaV07CiAgICAgIC8vIHBhcnQgbWF5IGJlIGEgY2hhcmFjdGVyIG9yICdudW1lcmljJyBtZW1iZXIgbmFtZQogICAgICBpZiAobyAhPT0gbnVsbCAmJiB0eXBlb2YgbyA9PT0gIm9iamVjdCIgJiYgcGFydCBpbiBvKSB7CiAgICAgICAgaWYgKGkgPT0gKGwgLSAxKSkgeyAvLyBpZiB3ZSBhcmUgYXQgdGhlIGVuZCBvZiB0aGUgbGluZSB0aGVuIGV2YWx1bGF0ZQogICAgICAgICAgaWYgKHR5cGVvZiBvW3BhcnRdID09PSAic3RyaW5nIikKICAgICAgICAgICAgb1twYXJ0XSA9IGV2YWwoIigiICsgb1twYXJ0XSArICIpIik7CiAgICAgICAgfSBlbHNlIHsgLy8gb3RoZXJ3aXNlIGNvbnRpbnVlIHRvIG5leHQgZW1iZWRkZWQgb2JqZWN0CiAgICAgICAgICBvID0gb1twYXJ0XTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICB9OwoKICAvLyBSZXRyaWV2ZSB0aGUgSFRNTFdpZGdldCBpbnN0YW5jZSAoaS5lLiB0aGUgcmV0dXJuIHZhbHVlIG9mIGFuCiAgLy8gSFRNTFdpZGdldCBiaW5kaW5nJ3MgaW5pdGlhbGl6ZSgpIG9yIGZhY3RvcnkoKSBmdW5jdGlvbikKICAvLyBhc3NvY2lhdGVkIHdpdGggYW4gZWxlbWVudCwgb3IgbnVsbCBpZiBub25lLgogIHdpbmRvdy5IVE1MV2lkZ2V0cy5nZXRJbnN0YW5jZSA9IGZ1bmN0aW9uKGVsKSB7CiAgICByZXR1cm4gZWxlbWVudERhdGEoZWwsICJpbml0X3Jlc3VsdCIpOwogIH07CgogIC8vIEZpbmRzIHRoZSBmaXJzdCBlbGVtZW50IGluIHRoZSBzY29wZSB0aGF0IG1hdGNoZXMgdGhlIHNlbGVjdG9yLAogIC8vIGFuZCByZXR1cm5zIHRoZSBIVE1MV2lkZ2V0IGluc3RhbmNlIChpLmUuIHRoZSByZXR1cm4gdmFsdWUgb2YKICAvLyBhbiBIVE1MV2lkZ2V0IGJpbmRpbmcncyBpbml0aWFsaXplKCkgb3IgZmFjdG9yeSgpIGZ1bmN0aW9uKQogIC8vIGFzc29jaWF0ZWQgd2l0aCB0aGF0IGVsZW1lbnQsIGlmIGFueS4gSWYgbm8gZWxlbWVudCBtYXRjaGVzIHRoZQogIC8vIHNlbGVjdG9yLCBvciB0aGUgZmlyc3QgbWF0Y2hpbmcgZWxlbWVudCBoYXMgbm8gSFRNTFdpZGdldAogIC8vIGluc3RhbmNlIGFzc29jaWF0ZWQgd2l0aCBpdCwgdGhlbiBudWxsIGlzIHJldHVybmVkLgogIC8vCiAgLy8gVGhlIHNjb3BlIGFyZ3VtZW50IGlzIG9wdGlvbmFsLCBhbmQgZGVmYXVsdHMgdG8gd2luZG93LmRvY3VtZW50LgogIHdpbmRvdy5IVE1MV2lkZ2V0cy5maW5kID0gZnVuY3Rpb24oc2NvcGUsIHNlbGVjdG9yKSB7CiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PSAxKSB7CiAgICAgIHNlbGVjdG9yID0gc2NvcGU7CiAgICAgIHNjb3BlID0gZG9jdW1lbnQ7CiAgICB9CgogICAgdmFyIGVsID0gc2NvcGUucXVlcnlTZWxlY3RvcihzZWxlY3Rvcik7CiAgICBpZiAoZWwgPT09IG51bGwpIHsKICAgICAgcmV0dXJuIG51bGw7CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gd2luZG93LkhUTUxXaWRnZXRzLmdldEluc3RhbmNlKGVsKTsKICAgIH0KICB9OwoKICAvLyBGaW5kcyBhbGwgZWxlbWVudHMgaW4gdGhlIHNjb3BlIHRoYXQgbWF0Y2ggdGhlIHNlbGVjdG9yLCBhbmQKICAvLyByZXR1cm5zIHRoZSBIVE1MV2lkZ2V0IGluc3RhbmNlcyAoaS5lLiB0aGUgcmV0dXJuIHZhbHVlcyBvZgogIC8vIGFuIEhUTUxXaWRnZXQgYmluZGluZydzIGluaXRpYWxpemUoKSBvciBmYWN0b3J5KCkgZnVuY3Rpb24pCiAgLy8gYXNzb2NpYXRlZCB3aXRoIHRoZSBlbGVtZW50cywgaW4gYW4gYXJyYXkuIElmIGVsZW1lbnRzIHRoYXQKICAvLyBtYXRjaCB0aGUgc2VsZWN0b3IgZG9uJ3QgaGF2ZSBhbiBhc3NvY2lhdGVkIEhUTUxXaWRnZXQKICAvLyBpbnN0YW5jZSwgdGhlIHJldHVybmVkIGFycmF5IHdpbGwgY29udGFpbiBudWxscy4KICAvLwogIC8vIFRoZSBzY29wZSBhcmd1bWVudCBpcyBvcHRpb25hbCwgYW5kIGRlZmF1bHRzIHRvIHdpbmRvdy5kb2N1bWVudC4KICB3aW5kb3cuSFRNTFdpZGdldHMuZmluZEFsbCA9IGZ1bmN0aW9uKHNjb3BlLCBzZWxlY3RvcikgewogICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT0gMSkgewogICAgICBzZWxlY3RvciA9IHNjb3BlOwogICAgICBzY29wZSA9IGRvY3VtZW50OwogICAgfQoKICAgIHZhciBub2RlcyA9IHNjb3BlLnF1ZXJ5U2VsZWN0b3JBbGwoc2VsZWN0b3IpOwogICAgdmFyIHJlc3VsdHMgPSBbXTsKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbm9kZXMubGVuZ3RoOyBpKyspIHsKICAgICAgcmVzdWx0cy5wdXNoKHdpbmRvdy5IVE1MV2lkZ2V0cy5nZXRJbnN0YW5jZShub2Rlc1tpXSkpOwogICAgfQogICAgcmV0dXJuIHJlc3VsdHM7CiAgfTsKCiAgdmFyIHBvc3RSZW5kZXJIYW5kbGVycyA9IFtdOwogIGZ1bmN0aW9uIGludm9rZVBvc3RSZW5kZXJIYW5kbGVycygpIHsKICAgIHdoaWxlIChwb3N0UmVuZGVySGFuZGxlcnMubGVuZ3RoKSB7CiAgICAgIHZhciBoYW5kbGVyID0gcG9zdFJlbmRlckhhbmRsZXJzLnNoaWZ0KCk7CiAgICAgIGlmIChoYW5kbGVyKSB7CiAgICAgICAgaGFuZGxlcigpOwogICAgICB9CiAgICB9CiAgfQoKICAvLyBSZWdpc3RlciB0aGUgZ2l2ZW4gY2FsbGJhY2sgZnVuY3Rpb24gdG8gYmUgaW52b2tlZCBhZnRlciB0aGUKICAvLyBuZXh0IHRpbWUgc3RhdGljIHdpZGdldHMgYXJlIHJlbmRlcmVkLgogIHdpbmRvdy5IVE1MV2lkZ2V0cy5hZGRQb3N0UmVuZGVySGFuZGxlciA9IGZ1bmN0aW9uKGNhbGxiYWNrKSB7CiAgICBwb3N0UmVuZGVySGFuZGxlcnMucHVzaChjYWxsYmFjayk7CiAgfTsKCiAgLy8gVGFrZXMgYSBuZXctc3R5bGUgaW5zdGFuY2UtYm91bmQgZGVmaW5pdGlvbiwgYW5kIHJldHVybnMgYW4KICAvLyBvbGQtc3R5bGUgY2xhc3MtYm91bmQgZGVmaW5pdGlvbi4gVGhpcyBzYXZlcyB1cyBmcm9tIGhhdmluZwogIC8vIHRvIHJld3JpdGUgYWxsIHRoZSBsb2dpYyBpbiB0aGlzIGZpbGUgdG8gYWNjb21vZGF0ZSBib3RoCiAgLy8gdHlwZXMgb2YgZGVmaW5pdGlvbnMuCiAgZnVuY3Rpb24gY3JlYXRlTGVnYWN5RGVmaW5pdGlvbkFkYXB0ZXIoZGVmbikgewogICAgdmFyIHJlc3VsdCA9IHsKICAgICAgbmFtZTogZGVmbi5uYW1lLAogICAgICB0eXBlOiBkZWZuLnR5cGUsCiAgICAgIGluaXRpYWxpemU6IGZ1bmN0aW9uKGVsLCB3aWR0aCwgaGVpZ2h0KSB7CiAgICAgICAgcmV0dXJuIGRlZm4uZmFjdG9yeShlbCwgd2lkdGgsIGhlaWdodCk7CiAgICAgIH0sCiAgICAgIHJlbmRlclZhbHVlOiBmdW5jdGlvbihlbCwgeCwgaW5zdGFuY2UpIHsKICAgICAgICByZXR1cm4gaW5zdGFuY2UucmVuZGVyVmFsdWUoeCk7CiAgICAgIH0sCiAgICAgIHJlc2l6ZTogZnVuY3Rpb24oZWwsIHdpZHRoLCBoZWlnaHQsIGluc3RhbmNlKSB7CiAgICAgICAgcmV0dXJuIGluc3RhbmNlLnJlc2l6ZSh3aWR0aCwgaGVpZ2h0KTsKICAgICAgfQogICAgfTsKCiAgICBpZiAoZGVmbi5maW5kKQogICAgICByZXN1bHQuZmluZCA9IGRlZm4uZmluZDsKICAgIGlmIChkZWZuLnJlbmRlckVycm9yKQogICAgICByZXN1bHQucmVuZGVyRXJyb3IgPSBkZWZuLnJlbmRlckVycm9yOwogICAgaWYgKGRlZm4uY2xlYXJFcnJvcikKICAgICAgcmVzdWx0LmNsZWFyRXJyb3IgPSBkZWZuLmNsZWFyRXJyb3I7CgogICAgcmV0dXJuIHJlc3VsdDsKICB9Cn0pKCk7Cgo=\"></script>\n",
       "<script title=\"wordcloud2\" src=\"data:application/javascript;base64,LyohCiAqIHdvcmRjbG91ZDIuanMKICogaHR0cDovL3RpbWRyZWFtLm9yZy93b3JkY2xvdWQyLmpzLwogKgogKiBDb3B5cmlnaHQgMjAxMSAtIDIwMTMgVGltIENoaWVuCiAqIFJlbGVhc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZQogKi8KCid1c2Ugc3RyaWN0JzsKCi8vIHNldEltbWVkaWF0ZQppZiAoIXdpbmRvdy5zZXRJbW1lZGlhdGUpIHsKICB3aW5kb3cuc2V0SW1tZWRpYXRlID0gKGZ1bmN0aW9uIHNldHVwU2V0SW1tZWRpYXRlKCkgewogICAgcmV0dXJuIHdpbmRvdy5tc1NldEltbWVkaWF0ZSB8fAogICAgd2luZG93LndlYmtpdFNldEltbWVkaWF0ZSB8fAogICAgd2luZG93Lm1velNldEltbWVkaWF0ZSB8fAogICAgd2luZG93Lm9TZXRJbW1lZGlhdGUgfHwKICAgIChmdW5jdGlvbiBzZXR1cFNldFplcm9UaW1lb3V0KCkgewogICAgICBpZiAoIXdpbmRvdy5wb3N0TWVzc2FnZSB8fCAhd2luZG93LmFkZEV2ZW50TGlzdGVuZXIpIHsKICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgfQoKICAgICAgdmFyIGNhbGxiYWNrcyA9IFt1bmRlZmluZWRdOwogICAgICB2YXIgbWVzc2FnZSA9ICd6ZXJvLXRpbWVvdXQtbWVzc2FnZSc7CgogICAgICAvLyBMaWtlIHNldFRpbWVvdXQsIGJ1dCBvbmx5IHRha2VzIGEgZnVuY3Rpb24gYXJndW1lbnQuICBUaGVyZSdzCiAgICAgIC8vIG5vIHRpbWUgYXJndW1lbnQgKGFsd2F5cyB6ZXJvKSBhbmQgbm8gYXJndW1lbnRzICh5b3UgaGF2ZSB0bwogICAgICAvLyB1c2UgYSBjbG9zdXJlKS4KICAgICAgdmFyIHNldFplcm9UaW1lb3V0ID0gZnVuY3Rpb24gc2V0WmVyb1RpbWVvdXQoY2FsbGJhY2spIHsKICAgICAgICB2YXIgaWQgPSBjYWxsYmFja3MubGVuZ3RoOwogICAgICAgIGNhbGxiYWNrcy5wdXNoKGNhbGxiYWNrKTsKICAgICAgICB3aW5kb3cucG9zdE1lc3NhZ2UobWVzc2FnZSArIGlkLnRvU3RyaW5nKDM2KSwgJyonKTsKCiAgICAgICAgcmV0dXJuIGlkOwogICAgICB9OwoKICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ21lc3NhZ2UnLCBmdW5jdGlvbiBzZXRaZXJvVGltZW91dE1lc3NhZ2UoZXZ0KSB7CiAgICAgICAgLy8gU2tpcHBpbmcgY2hlY2tpbmcgZXZlbnQgc291cmNlLCByZXRhcmRlZCBJRSBjb25mdXNlZCB0aGlzIHdpbmRvdwogICAgICAgIC8vIG9iamVjdCB3aXRoIGFub3RoZXIgaW4gdGhlIHByZXNlbmNlIG9mIGlmcmFtZQogICAgICAgIGlmICh0eXBlb2YgZXZ0LmRhdGEgIT09ICdzdHJpbmcnIHx8CiAgICAgICAgICAgIGV2dC5kYXRhLnN1YnN0cigwLCBtZXNzYWdlLmxlbmd0aCkgIT09IG1lc3NhZ2UvKiB8fAogICAgICAgICAgICBldnQuc291cmNlICE9PSB3aW5kb3cgKi8pIHsKICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgIGV2dC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTsKCiAgICAgICAgdmFyIGlkID0gcGFyc2VJbnQoZXZ0LmRhdGEuc3Vic3RyKG1lc3NhZ2UubGVuZ3RoKSwgMzYpOwogICAgICAgIGlmICghY2FsbGJhY2tzW2lkXSkgewogICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KCiAgICAgICAgY2FsbGJhY2tzW2lkXSgpOwogICAgICAgIGNhbGxiYWNrc1tpZF0gPSB1bmRlZmluZWQ7CiAgICAgIH0sIHRydWUpOwoKICAgICAgLyogc3BlY2lmeSBjbGVhckltbWVkaWF0ZSgpIGhlcmUgc2luY2Ugd2UgbmVlZCB0aGUgc2NvcGUgKi8KICAgICAgd2luZG93LmNsZWFySW1tZWRpYXRlID0gZnVuY3Rpb24gY2xlYXJaZXJvVGltZW91dChpZCkgewogICAgICAgIGlmICghY2FsbGJhY2tzW2lkXSkgewogICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KCiAgICAgICAgY2FsbGJhY2tzW2lkXSA9IHVuZGVmaW5lZDsKICAgICAgfTsKCiAgICAgIHJldHVybiBzZXRaZXJvVGltZW91dDsKICAgIH0pKCkgfHwKICAgIC8vIGZhbGxiYWNrCiAgICBmdW5jdGlvbiBzZXRJbW1lZGlhdGVGYWxsYmFjayhmbikgewogICAgICB3aW5kb3cuc2V0VGltZW91dChmbiwgMCk7CiAgICB9OwogIH0pKCk7Cn0KCmlmICghd2luZG93LmNsZWFySW1tZWRpYXRlKSB7CiAgd2luZG93LmNsZWFySW1tZWRpYXRlID0gKGZ1bmN0aW9uIHNldHVwQ2xlYXJJbW1lZGlhdGUoKSB7CiAgICByZXR1cm4gd2luZG93Lm1zQ2xlYXJJbW1lZGlhdGUgfHwKICAgIHdpbmRvdy53ZWJraXRDbGVhckltbWVkaWF0ZSB8fAogICAgd2luZG93Lm1vekNsZWFySW1tZWRpYXRlIHx8CiAgICB3aW5kb3cub0NsZWFySW1tZWRpYXRlIHx8CiAgICAvLyAiY2xlYXJaZXJvVGltZW91dCIgaXMgaW1wbGVtZW50IG9uIHRoZSBwcmV2aW91cyBibG9jayB8fAogICAgLy8gZmFsbGJhY2sKICAgIGZ1bmN0aW9uIGNsZWFySW1tZWRpYXRlRmFsbGJhY2sodGltZXIpIHsKICAgICAgd2luZG93LmNsZWFyVGltZW91dCh0aW1lcik7CiAgICB9OwogIH0pKCk7Cn0KCihmdW5jdGlvbihnbG9iYWwpIHsKCiAgLy8gQ2hlY2sgaWYgV29yZENsb3VkIGNhbiBydW4gb24gdGhpcyBicm93c2VyCiAgdmFyIGlzU3VwcG9ydGVkID0gKGZ1bmN0aW9uIGlzU3VwcG9ydGVkKCkgewogICAgdmFyIGNhbnZhcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2NhbnZhcycpOwogICAgaWYgKCFjYW52YXMgfHwgIWNhbnZhcy5nZXRDb250ZXh0KSB7CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KCiAgICB2YXIgY3R4ID0gY2FudmFzLmdldENvbnRleHQoJzJkJyk7CiAgICBpZiAoIWN0eC5nZXRJbWFnZURhdGEpIHsKICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogICAgaWYgKCFjdHguZmlsbFRleHQpIHsKICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQoKICAgIGlmICghQXJyYXkucHJvdG90eXBlLnNvbWUpIHsKICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogICAgaWYgKCFBcnJheS5wcm90b3R5cGUucHVzaCkgewogICAgICByZXR1cm4gZmFsc2U7CiAgICB9CgogICAgcmV0dXJuIHRydWU7CiAgfSgpKTsKCiAgLy8gRmluZCBvdXQgaWYgdGhlIGJyb3dzZXIgaW1wb3NlIG1pbml1bSBmb250IHNpemUgYnkKICAvLyBkcmF3aW5nIHNtYWxsIHRleHRzIG9uIGEgY2FudmFzIGFuZCBtZWFzdXJlIGl0J3Mgd2lkdGguCiAgdmFyIG1pbkZvbnRTaXplID0gKGZ1bmN0aW9uIGdldE1pbkZvbnRTaXplKCkgewogICAgaWYgKCFpc1N1cHBvcnRlZCkgewogICAgICByZXR1cm47CiAgICB9CgogICAgdmFyIGN0eCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2NhbnZhcycpLmdldENvbnRleHQoJzJkJyk7CgogICAgLy8gc3RhcnQgZnJvbSAyMAogICAgdmFyIHNpemUgPSAyMDsKCiAgICAvLyB0d28gc2l6ZXMgdG8gbWVhc3VyZQogICAgdmFyIGhhbldpZHRoLCBtV2lkdGg7CgogICAgd2hpbGUgKHNpemUpIHsKICAgICAgY3R4LmZvbnQgPSBzaXplLnRvU3RyaW5nKDEwKSArICdweCBzYW5zLXNlcmlmJzsKICAgICAgaWYgKChjdHgubWVhc3VyZVRleHQoJ1x1RkYzNycpLndpZHRoID09PSBoYW5XaWR0aCkgJiYKICAgICAgICAgIChjdHgubWVhc3VyZVRleHQoJ20nKS53aWR0aCkgPT09IG1XaWR0aCkgewogICAgICAgIHJldHVybiAoc2l6ZSArIDEpOwogICAgICB9CgogICAgICBoYW5XaWR0aCA9IGN0eC5tZWFzdXJlVGV4dCgnXHVGRjM3Jykud2lkdGg7CiAgICAgIG1XaWR0aCA9IGN0eC5tZWFzdXJlVGV4dCgnbScpLndpZHRoOwoKICAgICAgc2l6ZS0tOwogICAgfQoKICAgIHJldHVybiAwOwogIH0pKCk7CgogIC8vIEJhc2VkIG9uIGh0dHA6Ly9qc2Zyb21oZWxsLmNvbS9hcnJheS9zaHVmZmxlCiAgdmFyIHNodWZmbGVBcnJheSA9IGZ1bmN0aW9uIHNodWZmbGVBcnJheShhcnIpIHsKICAgIGZvciAodmFyIGosIHgsIGkgPSBhcnIubGVuZ3RoOyBpOwogICAgICBqID0gTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogaSksCiAgICAgIHggPSBhcnJbLS1pXSwgYXJyW2ldID0gYXJyW2pdLAogICAgICBhcnJbal0gPSB4KSB7fQogICAgcmV0dXJuIGFycjsKICB9OwoKICB2YXIgV29yZENsb3VkID0gZnVuY3Rpb24gV29yZENsb3VkKGVsZW1lbnRzLCBvcHRpb25zKSB7CiAgICBpZiAoIWlzU3VwcG9ydGVkKSB7CiAgICAgIHJldHVybjsKICAgIH0KCiAgICBpZiAoIUFycmF5LmlzQXJyYXkoZWxlbWVudHMpKSB7CiAgICAgIGVsZW1lbnRzID0gW2VsZW1lbnRzXTsKICAgIH0KCiAgICBlbGVtZW50cy5mb3JFYWNoKGZ1bmN0aW9uKGVsLCBpKSB7CiAgICAgIGlmICh0eXBlb2YgZWwgPT09ICdzdHJpbmcnKSB7CiAgICAgICAgZWxlbWVudHNbaV0gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChlbCk7CiAgICAgICAgaWYgKCFlbGVtZW50c1tpXSkgewogICAgICAgICAgdGhyb3cgJ1RoZSBlbGVtZW50IGlkIHNwZWNpZmllZCBpcyBub3QgZm91bmQuJzsKICAgICAgICB9CiAgICAgIH0gZWxzZSBpZiAoIWVsLnRhZ05hbWUgJiYgIWVsLmFwcGVuZENoaWxkKSB7CiAgICAgICAgdGhyb3cgJ1lvdSBtdXN0IHBhc3MgdmFsaWQgSFRNTCBlbGVtZW50cywgb3IgSUQgb2YgdGhlIGVsZW1lbnQuJzsKICAgICAgfQogICAgfSk7CgogICAgLyogRGVmYXVsdCB2YWx1ZXMgdG8gYmUgb3ZlcndyaXR0ZW4gYnkgb3B0aW9ucyBvYmplY3QgKi8KICAgIHZhciBzZXR0aW5ncyA9IHsKICAgICAgbGlzdDogW10sCiAgICAgIGZvbnRGYW1pbHk6ICciVHJlYnVjaGV0IE1TIiwgIkhlaXRpIFRDIiwgIuW+rui7n+ato+m7kemrlCIsICcgKwogICAgICAgICAgICAgICAgICAnIkFyaWFsIFVuaWNvZGUgTVMiLCAiRHJvaWQgRmFsbGJhY2sgU2FucyIsIHNhbnMtc2VyaWYnLAogICAgICBmb250V2VpZ2h0OiAnbm9ybWFsJywKICAgICAgY29sb3I6ICdyYW5kb20tZGFyaycsCiAgICAgIG1pblNpemU6IDAsIC8vIDAgdG8gZGlzYWJsZQogICAgICB3ZWlnaHRGYWN0b3I6IDEsCiAgICAgIGNsZWFyQ2FudmFzOiB0cnVlLAogICAgICBiYWNrZ3JvdW5kQ29sb3I6ICcjZmZmJywgIC8vIG9wYXF1ZSB3aGl0ZSA9IHJnYmEoMjU1LCAyNTUsIDI1NSwgMSkKCiAgICAgIGdyaWRTaXplOiA4LAogICAgICBvcmlnaW46IG51bGwsCgogICAgICBkcmF3TWFzazogZmFsc2UsCiAgICAgIG1hc2tDb2xvcjogJ3JnYmEoMjU1LDAsMCwwLjMpJywKICAgICAgbWFza0dhcFdpZHRoOiAwLjMsCgogICAgICB3YWl0OiAwLAogICAgICBhYm9ydFRocmVzaG9sZDogMCwgLy8gZGlzYWJsZWQKICAgICAgYWJvcnQ6IGZ1bmN0aW9uIG5vb3AoKSB7fSwKCiAgICAgIG1pblJvdGF0aW9uOiAtIE1hdGguUEkgLyAyLAogICAgICBtYXhSb3RhdGlvbjogTWF0aC5QSSAvIDIsCgogICAgICBzaHVmZmxlOiB0cnVlLAogICAgICByb3RhdGVSYXRpbzogMC4xLAoKICAgICAgc2hhcGU6ICdjaXJjbGUnLAogICAgICBlbGxpcHRpY2l0eTogMC42NSwKCiAgICAgIGNsYXNzZXM6IG51bGwsCgogICAgICBob3ZlcjogbnVsbCwKICAgICAgY2xpY2s6IG51bGwKICAgIH07CgogICAgaWYgKG9wdGlvbnMpIHsKICAgICAgZm9yICh2YXIga2V5IGluIG9wdGlvbnMpIHsKICAgICAgICBpZiAoa2V5IGluIHNldHRpbmdzKSB7CiAgICAgICAgICBzZXR0aW5nc1trZXldID0gb3B0aW9uc1trZXldOwogICAgICAgIH0KICAgICAgfQogICAgfQoKICAgIC8qIENvbnZlcnQgd2VpZ2h0RmFjdG9yIGludG8gYSBmdW5jdGlvbiAqLwogICAgaWYgKHR5cGVvZiBzZXR0aW5ncy53ZWlnaHRGYWN0b3IgIT09ICdmdW5jdGlvbicpIHsKICAgICAgdmFyIGZhY3RvciA9IHNldHRpbmdzLndlaWdodEZhY3RvcjsKICAgICAgc2V0dGluZ3Mud2VpZ2h0RmFjdG9yID0gZnVuY3Rpb24gd2VpZ2h0RmFjdG9yKHB0KSB7CiAgICAgICAgcmV0dXJuIHB0ICogZmFjdG9yOyAvL2luIHB4CiAgICAgIH07CiAgICB9CgogICAgLyogQ29udmVydCBzaGFwZSBpbnRvIGEgZnVuY3Rpb24gKi8KICAgIGlmICh0eXBlb2Ygc2V0dGluZ3Muc2hhcGUgIT09ICdmdW5jdGlvbicpIHsKICAgICAgc3dpdGNoIChzZXR0aW5ncy5zaGFwZSkgewogICAgICAgIGNhc2UgJ2NpcmNsZSc6CiAgICAgICAgLyogZmFsbHMgdGhyb3VnaCAqLwogICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAvLyAnY2lyY2xlJyBpcyB0aGUgZGVmYXVsdCBhbmQgYSBzaG9ydGN1dCBpbiB0aGUgY29kZSBsb29wLgogICAgICAgICAgc2V0dGluZ3Muc2hhcGUgPSAnY2lyY2xlJzsKICAgICAgICAgIGJyZWFrOwoKICAgICAgICBjYXNlICdjYXJkaW9pZCc6CiAgICAgICAgICBzZXR0aW5ncy5zaGFwZSA9IGZ1bmN0aW9uIHNoYXBlQ2FyZGlvaWQodGhldGEpIHsKICAgICAgICAgICAgcmV0dXJuIDEgLSBNYXRoLnNpbih0aGV0YSk7CiAgICAgICAgICB9OwogICAgICAgICAgYnJlYWs7CgogICAgICAgIC8qCgogICAgICAgIFRvIHdvcmsgb3V0IGFuIFgtZ29uLCBvbmUgaGFzIHRvIGNhbGN1bGF0ZSAibSIsCiAgICAgICAgd2hlcmUgMS8oY29zKDIqUEkvWCkrbSpzaW4oMipQSS9YKSkgPSAxLyhjb3MoMCkrbSpzaW4oMCkpCiAgICAgICAgaHR0cDovL3d3dy53b2xmcmFtYWxwaGEuY29tL2lucHV0Lz9pPTElMkYlMjhjb3MlMjgyKlBJJTJGWCUyOSUyQm0qc2luJTI4CiAgICAgICAgMipQSSUyRlglMjklMjkrJTNEKzElMkYlMjhjb3MlMjgwJTI5JTJCbSpzaW4lMjgwJTI5JTI5CgogICAgICAgIENvcHkgdGhlIHNvbHV0aW9uIGludG8gcG9sYXIgZXF1YXRpb24gciA9IDEvKGNvcyh0JykgKyBtKnNpbih0JykpCiAgICAgICAgd2hlcmUgdCcgZXF1YWxzIHRvIG1vZCh0LCAyUEkvWCk7CgogICAgICAgICovCgogICAgICAgIGNhc2UgJ2RpYW1vbmQnOgogICAgICAgIGNhc2UgJ3NxdWFyZSc6CiAgICAgICAgICAvLyBodHRwOi8vd3d3LndvbGZyYW1hbHBoYS5jb20vaW5wdXQvP2k9cGxvdCtyKyUzRCsxJTJGJTI4Y29zJTI4bW9kKwogICAgICAgICAgLy8gJTI4dCUyQytQSSUyRjIlMjklMjklMkJzaW4lMjhtb2QrJTI4dCUyQytQSSUyRjIlMjklMjklMjklMkMrdCslM0QKICAgICAgICAgIC8vICswKy4uKzIqUEkKICAgICAgICAgIHNldHRpbmdzLnNoYXBlID0gZnVuY3Rpb24gc2hhcGVTcXVhcmUodGhldGEpIHsKICAgICAgICAgICAgdmFyIHRoZXRhUHJpbWUgPSB0aGV0YSAlICgyICogTWF0aC5QSSAvIDQpOwogICAgICAgICAgICByZXR1cm4gMSAvIChNYXRoLmNvcyh0aGV0YVByaW1lKSArIE1hdGguc2luKHRoZXRhUHJpbWUpKTsKICAgICAgICAgIH07CiAgICAgICAgICBicmVhazsKCiAgICAgICAgY2FzZSAndHJpYW5nbGUtZm9yd2FyZCc6CiAgICAgICAgICAvLyBodHRwOi8vd3d3LndvbGZyYW1hbHBoYS5jb20vaW5wdXQvP2k9cGxvdCtyKyUzRCsxJTJGJTI4Y29zJTI4bW9kKwogICAgICAgICAgLy8gJTI4dCUyQysyKlBJJTJGMyUyOSUyOSUyQnNxcnQlMjgzJTI5c2luJTI4bW9kKyUyOHQlMkMrMipQSSUyRjMlMjkKICAgICAgICAgIC8vICUyOSUyOSUyQyt0KyUzRCswKy4uKzIqUEkKICAgICAgICAgIHNldHRpbmdzLnNoYXBlID0gZnVuY3Rpb24gc2hhcGVUcmlhbmdsZSh0aGV0YSkgewogICAgICAgICAgICB2YXIgdGhldGFQcmltZSA9IHRoZXRhICUgKDIgKiBNYXRoLlBJIC8gMyk7CiAgICAgICAgICAgIHJldHVybiAxIC8gKE1hdGguY29zKHRoZXRhUHJpbWUpICsKICAgICAgICAgICAgICAgICAgICAgICAgTWF0aC5zcXJ0KDMpICogTWF0aC5zaW4odGhldGFQcmltZSkpOwogICAgICAgICAgfTsKICAgICAgICAgIGJyZWFrOwoKICAgICAgICBjYXNlICd0cmlhbmdsZSc6CiAgICAgICAgY2FzZSAndHJpYW5nbGUtdXByaWdodCc6CiAgICAgICAgICBzZXR0aW5ncy5zaGFwZSA9IGZ1bmN0aW9uIHNoYXBlVHJpYW5nbGUodGhldGEpIHsKICAgICAgICAgICAgdmFyIHRoZXRhUHJpbWUgPSAodGhldGEgKyBNYXRoLlBJICogMyAvIDIpICUgKDIgKiBNYXRoLlBJIC8gMyk7CiAgICAgICAgICAgIHJldHVybiAxIC8gKE1hdGguY29zKHRoZXRhUHJpbWUpICsKICAgICAgICAgICAgICAgICAgICAgICAgTWF0aC5zcXJ0KDMpICogTWF0aC5zaW4odGhldGFQcmltZSkpOwogICAgICAgICAgfTsKICAgICAgICAgIGJyZWFrOwoKICAgICAgICBjYXNlICdwZW50YWdvbic6CiAgICAgICAgICBzZXR0aW5ncy5zaGFwZSA9IGZ1bmN0aW9uIHNoYXBlUGVudGFnb24odGhldGEpIHsKICAgICAgICAgICAgdmFyIHRoZXRhUHJpbWUgPSAodGhldGEgKyAwLjk1NSkgJSAoMiAqIE1hdGguUEkgLyA1KTsKICAgICAgICAgICAgcmV0dXJuIDEgLyAoTWF0aC5jb3ModGhldGFQcmltZSkgKwogICAgICAgICAgICAgICAgICAgICAgICAwLjcyNjU0MyAqIE1hdGguc2luKHRoZXRhUHJpbWUpKTsKICAgICAgICAgIH07CiAgICAgICAgICBicmVhazsKCiAgICAgICAgY2FzZSAnc3Rhcic6CiAgICAgICAgICBzZXR0aW5ncy5zaGFwZSA9IGZ1bmN0aW9uIHNoYXBlU3Rhcih0aGV0YSkgewogICAgICAgICAgICB2YXIgdGhldGFQcmltZSA9ICh0aGV0YSArIDAuOTU1KSAlICgyICogTWF0aC5QSSAvIDEwKTsKICAgICAgICAgICAgaWYgKCh0aGV0YSArIDAuOTU1KSAlICgyICogTWF0aC5QSSAvIDUpIC0gKDIgKiBNYXRoLlBJIC8gMTApID49IDApIHsKICAgICAgICAgICAgICByZXR1cm4gMSAvIChNYXRoLmNvcygoMiAqIE1hdGguUEkgLyAxMCkgLSB0aGV0YVByaW1lKSArCiAgICAgICAgICAgICAgICAgICAgICAgICAgMy4wNzc2OCAqIE1hdGguc2luKCgyICogTWF0aC5QSSAvIDEwKSAtIHRoZXRhUHJpbWUpKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICByZXR1cm4gMSAvIChNYXRoLmNvcyh0aGV0YVByaW1lKSArCiAgICAgICAgICAgICAgICAgICAgICAgICAgMy4wNzc2OCAqIE1hdGguc2luKHRoZXRhUHJpbWUpKTsKICAgICAgICAgICAgfQogICAgICAgICAgfTsKICAgICAgICAgIGJyZWFrOwogICAgICB9CiAgICB9CgogICAgLyogTWFrZSBzdXJlIGdyaWRTaXplIGlzIGEgd2hvbGUgbnVtYmVyIGFuZCBpcyBub3Qgc21hbGxlciB0aGFuIDRweCAqLwogICAgc2V0dGluZ3MuZ3JpZFNpemUgPSBNYXRoLm1heChNYXRoLmZsb29yKHNldHRpbmdzLmdyaWRTaXplKSwgNCk7CgogICAgLyogc2hvcnRoYW5kICovCiAgICB2YXIgZyA9IHNldHRpbmdzLmdyaWRTaXplOwogICAgdmFyIG1hc2tSZWN0V2lkdGggPSBnIC0gc2V0dGluZ3MubWFza0dhcFdpZHRoOwoKICAgIC8qIG5vcm1hbGl6ZSByb3RhdGlvbiBzZXR0aW5ncyAqLwogICAgdmFyIHJvdGF0aW9uUmFuZ2UgPSBNYXRoLmFicyhzZXR0aW5ncy5tYXhSb3RhdGlvbiAtIHNldHRpbmdzLm1pblJvdGF0aW9uKTsKICAgIHZhciBtaW5Sb3RhdGlvbiA9IE1hdGgubWluKHNldHRpbmdzLm1heFJvdGF0aW9uLCBzZXR0aW5ncy5taW5Sb3RhdGlvbik7CgogICAgLyogaW5mb3JtYXRpb24vb2JqZWN0IGF2YWlsYWJsZSB0byBhbGwgZnVuY3Rpb25zLCBzZXQgd2hlbiBzdGFydCgpICovCiAgICB2YXIgZ3JpZCwgLy8gMmQgYXJyYXkgY29udGFpbmluZyBmaWxsaW5nIGluZm9ybWF0aW9uCiAgICAgIG5neCwgbmd5LCAvLyB3aWR0aCBhbmQgaGVpZ2h0IG9mIHRoZSBncmlkCiAgICAgIGNlbnRlciwgLy8gcG9zaXRpb24gb2YgdGhlIGNlbnRlciBvZiB0aGUgY2xvdWQKICAgICAgbWF4UmFkaXVzOwoKICAgIC8qIHRpbWVzdGFtcCBmb3IgbWVhc3VyaW5nIGVhY2ggcHV0V29yZCgpIGFjdGlvbiAqLwogICAgdmFyIGVzY2FwZVRpbWU7CgogICAgLyogZnVuY3Rpb24gZm9yIGdldHRpbmcgdGhlIGNvbG9yIG9mIHRoZSB0ZXh0ICovCiAgICB2YXIgZ2V0VGV4dENvbG9yOwogICAgZnVuY3Rpb24gcmFuZG9tX2hzbF9jb2xvcihtaW4sIG1heCkgewogICAgICByZXR1cm4gJ2hzbCgnICsKICAgICAgICAoTWF0aC5yYW5kb20oKSAqIDM2MCkudG9GaXhlZCgpICsgJywnICsKICAgICAgICAoTWF0aC5yYW5kb20oKSAqIDMwICsgNzApLnRvRml4ZWQoKSArICclLCcgKwogICAgICAgIChNYXRoLnJhbmRvbSgpICogKG1heCAtIG1pbikgKyBtaW4pLnRvRml4ZWQoKSArICclKSc7CiAgICB9CiAgICBzd2l0Y2ggKHNldHRpbmdzLmNvbG9yKSB7CiAgICAgIGNhc2UgJ3JhbmRvbS1kYXJrJzoKICAgICAgICBnZXRUZXh0Q29sb3IgPSBmdW5jdGlvbiBnZXRSYW5kb21EYXJrQ29sb3IoKSB7CiAgICAgICAgICByZXR1cm4gcmFuZG9tX2hzbF9jb2xvcigxMCwgNTApOwogICAgICAgIH07CiAgICAgICAgYnJlYWs7CgogICAgICBjYXNlICdyYW5kb20tbGlnaHQnOgogICAgICAgIGdldFRleHRDb2xvciA9IGZ1bmN0aW9uIGdldFJhbmRvbUxpZ2h0Q29sb3IoKSB7CiAgICAgICAgICByZXR1cm4gcmFuZG9tX2hzbF9jb2xvcig1MCwgOTApOwogICAgICAgIH07CiAgICAgICAgYnJlYWs7CgogICAgICBkZWZhdWx0OgogICAgICAgIGlmICh0eXBlb2Ygc2V0dGluZ3MuY29sb3IgPT09ICdmdW5jdGlvbicpIHsKICAgICAgICAgIGdldFRleHRDb2xvciA9IHNldHRpbmdzLmNvbG9yOwogICAgICAgIH0KICAgICAgICBicmVhazsKICAgIH0KCiAgICAvKiBmdW5jdGlvbiBmb3IgZ2V0dGluZyB0aGUgY2xhc3NlcyBvZiB0aGUgdGV4dCAqLwogICAgdmFyIGdldFRleHRDbGFzc2VzID0gbnVsbDsKICAgIGlmICh0eXBlb2Ygc2V0dGluZ3MuY2xhc3NlcyA9PT0gJ2Z1bmN0aW9uJykgewogICAgICBnZXRUZXh0Q2xhc3NlcyA9IHNldHRpbmdzLmNsYXNzZXM7CiAgICB9CgogICAgLyogSW50ZXJhY3RpdmUgKi8KICAgIHZhciBpbnRlcmFjdGl2ZSA9IGZhbHNlOwogICAgdmFyIGluZm9HcmlkID0gW107CiAgICB2YXIgaG92ZXJlZDsKCiAgICB2YXIgZ2V0SW5mb0dyaWRGcm9tTW91c2VUb3VjaEV2ZW50ID0KICAgIGZ1bmN0aW9uIGdldEluZm9HcmlkRnJvbU1vdXNlVG91Y2hFdmVudChldnQpIHsKICAgICAgdmFyIGNhbnZhcyA9IGV2dC5jdXJyZW50VGFyZ2V0OwogICAgICB2YXIgcmVjdCA9IGNhbnZhcy5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTsKICAgICAgdmFyIGNsaWVudFg7CiAgICAgIHZhciBjbGllbnRZOwogICAgICAvKiogRGV0ZWN0IGlmIHRvdWNoZXMgYXJlIGF2YWlsYWJsZSAqLwogICAgICBpZiAoZXZ0LnRvdWNoZXMpIHsKICAgICAgICBjbGllbnRYID0gZXZ0LnRvdWNoZXNbMF0uY2xpZW50WDsKICAgICAgICBjbGllbnRZID0gZXZ0LnRvdWNoZXNbMF0uY2xpZW50WTsKICAgICAgfSBlbHNlIHsKICAgICAgICBjbGllbnRYID0gZXZ0LmNsaWVudFg7CiAgICAgICAgY2xpZW50WSA9IGV2dC5jbGllbnRZOwogICAgICB9CiAgICAgIHZhciBldmVudFggPSBjbGllbnRYIC0gcmVjdC5sZWZ0OwogICAgICB2YXIgZXZlbnRZID0gY2xpZW50WSAtIHJlY3QudG9wOwoKICAgICAgdmFyIHggPSBNYXRoLmZsb29yKGV2ZW50WCAqICgoY2FudmFzLndpZHRoIC8gcmVjdC53aWR0aCkgfHwgMSkgLyBnKTsKICAgICAgdmFyIHkgPSBNYXRoLmZsb29yKGV2ZW50WSAqICgoY2FudmFzLmhlaWdodCAvIHJlY3QuaGVpZ2h0KSB8fCAxKSAvIGcpOwoKICAgICAgcmV0dXJuIGluZm9HcmlkW3hdW3ldOwogICAgfTsKCiAgICB2YXIgd29yZGNsb3VkaG92ZXIgPSBmdW5jdGlvbiB3b3JkY2xvdWRob3ZlcihldnQpIHsKICAgICAgdmFyIGluZm8gPSBnZXRJbmZvR3JpZEZyb21Nb3VzZVRvdWNoRXZlbnQoZXZ0KTsKCiAgICAgIGlmIChob3ZlcmVkID09PSBpbmZvKSB7CiAgICAgICAgcmV0dXJuOwogICAgICB9CgogICAgICBob3ZlcmVkID0gaW5mbzsKICAgICAgaWYgKCFpbmZvKSB7CiAgICAgICAgc2V0dGluZ3MuaG92ZXIodW5kZWZpbmVkLCB1bmRlZmluZWQsIGV2dCk7CgogICAgICAgIHJldHVybjsKICAgICAgfQoKICAgICAgc2V0dGluZ3MuaG92ZXIoaW5mby5pdGVtLCBpbmZvLmRpbWVuc2lvbiwgZXZ0KTsKCiAgICB9OwoKICAgIHZhciB3b3JkY2xvdWRjbGljayA9IGZ1bmN0aW9uIHdvcmRjbG91ZGNsaWNrKGV2dCkgewogICAgICB2YXIgaW5mbyA9IGdldEluZm9HcmlkRnJvbU1vdXNlVG91Y2hFdmVudChldnQpOwogICAgICBpZiAoIWluZm8pIHsKICAgICAgICByZXR1cm47CiAgICAgIH0KCiAgICAgIHNldHRpbmdzLmNsaWNrKGluZm8uaXRlbSwgaW5mby5kaW1lbnNpb24sIGV2dCk7CiAgICAgIGV2dC5wcmV2ZW50RGVmYXVsdCgpOwogICAgfTsKCiAgICAvKiBHZXQgcG9pbnRzIG9uIHRoZSBncmlkIGZvciBhIGdpdmVuIHJhZGl1cyBhd2F5IGZyb20gdGhlIGNlbnRlciAqLwogICAgdmFyIHBvaW50c0F0UmFkaXVzID0gW107CiAgICB2YXIgZ2V0UG9pbnRzQXRSYWRpdXMgPSBmdW5jdGlvbiBnZXRQb2ludHNBdFJhZGl1cyhyYWRpdXMpIHsKICAgICAgaWYgKHBvaW50c0F0UmFkaXVzW3JhZGl1c10pIHsKICAgICAgICByZXR1cm4gcG9pbnRzQXRSYWRpdXNbcmFkaXVzXTsKICAgICAgfQoKICAgICAgLy8gTG9vayBmb3IgdGhlc2UgbnVtYmVyIG9mIHBvaW50cyBvbiBlYWNoIHJhZGl1cwogICAgICB2YXIgVCA9IHJhZGl1cyAqIDg7CgogICAgICAvLyBHZXR0aW5nIGFsbCB0aGUgcG9pbnRzIGF0IHRoaXMgcmFkaXVzCiAgICAgIHZhciB0ID0gVDsKICAgICAgdmFyIHBvaW50cyA9IFtdOwoKICAgICAgaWYgKHJhZGl1cyA9PT0gMCkgewogICAgICAgIHBvaW50cy5wdXNoKFtjZW50ZXJbMF0sIGNlbnRlclsxXSwgMF0pOwogICAgICB9CgogICAgICB3aGlsZSAodC0tKSB7CiAgICAgICAgLy8gZGlzdG9ydCB0aGUgcmFkaXVzIHRvIHB1dCB0aGUgY2xvdWQgaW4gc2hhcGUKICAgICAgICB2YXIgcnggPSAxOwogICAgICAgIGlmIChzZXR0aW5ncy5zaGFwZSAhPT0gJ2NpcmNsZScpIHsKICAgICAgICAgIHJ4ID0gc2V0dGluZ3Muc2hhcGUodCAvIFQgKiAyICogTWF0aC5QSSk7IC8vIDAgdG8gMQogICAgICAgIH0KCiAgICAgICAgLy8gUHVzaCBbeCwgeSwgdF07IHQgaXMgdXNlZCBzb2xlbHkgZm9yIGdldFRleHRDb2xvcigpCiAgICAgICAgcG9pbnRzLnB1c2goWwogICAgICAgICAgY2VudGVyWzBdICsgcmFkaXVzICogcnggKiBNYXRoLmNvcygtdCAvIFQgKiAyICogTWF0aC5QSSksCiAgICAgICAgICBjZW50ZXJbMV0gKyByYWRpdXMgKiByeCAqIE1hdGguc2luKC10IC8gVCAqIDIgKiBNYXRoLlBJKSAqCiAgICAgICAgICAgIHNldHRpbmdzLmVsbGlwdGljaXR5LAogICAgICAgICAgdCAvIFQgKiAyICogTWF0aC5QSV0pOwogICAgICB9CgogICAgICBwb2ludHNBdFJhZGl1c1tyYWRpdXNdID0gcG9pbnRzOwogICAgICByZXR1cm4gcG9pbnRzOwogICAgfTsKCiAgICAvKiBSZXR1cm4gdHJ1ZSBpZiB3ZSBoYWQgc3BlbnQgdG9vIG11Y2ggdGltZSAqLwogICAgdmFyIGV4Y2VlZFRpbWUgPSBmdW5jdGlvbiBleGNlZWRUaW1lKCkgewogICAgICByZXR1cm4gKChzZXR0aW5ncy5hYm9ydFRocmVzaG9sZCA+IDApICYmCiAgICAgICAgKChuZXcgRGF0ZSgpKS5nZXRUaW1lKCkgLSBlc2NhcGVUaW1lID4gc2V0dGluZ3MuYWJvcnRUaHJlc2hvbGQpKTsKICAgIH07CgogICAgLyogR2V0IHRoZSBkZWcgb2Ygcm90YXRpb24gYWNjb3JkaW5nIHRvIHNldHRpbmdzLCBhbmQgbHVjay4gKi8KICAgIHZhciBnZXRSb3RhdGVEZWcgPSBmdW5jdGlvbiBnZXRSb3RhdGVEZWcoKSB7CiAgICAgIGlmIChzZXR0aW5ncy5yb3RhdGVSYXRpbyA9PT0gMCkgewogICAgICAgIHJldHVybiAwOwogICAgICB9CgogICAgICBpZiAoTWF0aC5yYW5kb20oKSA+IHNldHRpbmdzLnJvdGF0ZVJhdGlvKSB7CiAgICAgICAgcmV0dXJuIDA7CiAgICAgIH0KCiAgICAgIGlmIChyb3RhdGlvblJhbmdlID09PSAwKSB7CiAgICAgICAgcmV0dXJuIG1pblJvdGF0aW9uOwogICAgICB9CgogICAgICByZXR1cm4gbWluUm90YXRpb24gKyBNYXRoLnJhbmRvbSgpICogcm90YXRpb25SYW5nZTsKICAgIH07CgogICAgdmFyIGdldFRleHRJbmZvID0gZnVuY3Rpb24gZ2V0VGV4dEluZm8od29yZCwgd2VpZ2h0LCByb3RhdGVEZWcpIHsKICAgICAgLy8gY2FsY3VsYXRlIHRoZSBhY3V0YWwgZm9udCBzaXplCiAgICAgIC8vIGZvbnRTaXplID09PSAwIG1lYW5zIHdlaWdodEZhY3RvciBmdW5jdGlvbiB3YW50cyB0aGUgdGV4dCBza2lwcGVkLAogICAgICAvLyBhbmQgc2l6ZSA8IG1pblNpemUgbWVhbnMgd2UgY2Fubm90IGRyYXcgdGhlIHRleHQuCiAgICAgIHZhciBkZWJ1ZyA9IGZhbHNlOwogICAgICB2YXIgZm9udFNpemUgPSBzZXR0aW5ncy53ZWlnaHRGYWN0b3Iod2VpZ2h0KTsKICAgICAgaWYgKGZvbnRTaXplIDw9IHNldHRpbmdzLm1pblNpemUpIHsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgIH0KCiAgICAgIC8vIFNjYWxlIGZhY3RvciBoZXJlIGlzIHRvIG1ha2Ugc3VyZSBmaWxsVGV4dCBpcyBub3QgbGltaXRlZCBieQogICAgICAvLyB0aGUgbWluaXVtIGZvbnQgc2l6ZSBzZXQgYnkgYnJvd3Nlci4KICAgICAgLy8gSXQgd2lsbCBhbHdheXMgYmUgMSBvciAybi4KICAgICAgdmFyIG11ID0gMTsKICAgICAgaWYgKGZvbnRTaXplIDwgbWluRm9udFNpemUpIHsKICAgICAgICBtdSA9IChmdW5jdGlvbiBjYWxjdWxhdGVTY2FsZUZhY3RvcigpIHsKICAgICAgICAgIHZhciBtdSA9IDI7CiAgICAgICAgICB3aGlsZSAobXUgKiBmb250U2l6ZSA8IG1pbkZvbnRTaXplKSB7CiAgICAgICAgICAgIG11ICs9IDI7CiAgICAgICAgICB9CiAgICAgICAgICByZXR1cm4gbXU7CiAgICAgICAgfSkoKTsKICAgICAgfQoKICAgICAgdmFyIGZjYW52YXMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdjYW52YXMnKTsKICAgICAgdmFyIGZjdHggPSBmY2FudmFzLmdldENvbnRleHQoJzJkJywgeyB3aWxsUmVhZEZyZXF1ZW50bHk6IHRydWUgfSk7CgogICAgICBmY3R4LmZvbnQgPSBzZXR0aW5ncy5mb250V2VpZ2h0ICsgJyAnICsKICAgICAgICAoZm9udFNpemUgKiBtdSkudG9TdHJpbmcoMTApICsgJ3B4ICcgKyBzZXR0aW5ncy5mb250RmFtaWx5OwoKICAgICAgLy8gRXN0aW1hdGUgdGhlIGRpbWVuc2lvbiBvZiB0aGUgdGV4dCB3aXRoIG1lYXN1cmVUZXh0KCkuCiAgICAgIHZhciBmdyA9IGZjdHgubWVhc3VyZVRleHQod29yZCkud2lkdGggLyBtdTsKICAgICAgdmFyIGZoID0gTWF0aC5tYXgoZm9udFNpemUgKiBtdSwKICAgICAgICAgICAgICAgICAgICAgICAgZmN0eC5tZWFzdXJlVGV4dCgnbScpLndpZHRoLAogICAgICAgICAgICAgICAgICAgICAgICBmY3R4Lm1lYXN1cmVUZXh0KCdcdUZGMzcnKS53aWR0aCkgLyBtdTsKCiAgICAgIC8vIENyZWF0ZSBhIGJvdW5kYXJ5IGJveCB0aGF0IGlzIGxhcmdlciB0aGFuIG91ciBlc3RpbWF0ZXMsCiAgICAgIC8vIHNvIHRleHQgZG9uJ3QgZ2V0IGN1dCBvZiAoaXQgc2lsbCBtaWdodCkKICAgICAgdmFyIGJveFdpZHRoID0gZncgKyBmaCAqIDI7CiAgICAgIHZhciBib3hIZWlnaHQgPSBmaCAqIDM7CiAgICAgIHZhciBmZ3cgPSBNYXRoLmNlaWwoYm94V2lkdGggLyBnKTsKICAgICAgdmFyIGZnaCA9IE1hdGguY2VpbChib3hIZWlnaHQgLyBnKTsKICAgICAgYm94V2lkdGggPSBmZ3cgKiBnOwogICAgICBib3hIZWlnaHQgPSBmZ2ggKiBnOwoKICAgICAgLy8gQ2FsY3VsYXRlIHRoZSBwcm9wZXIgb2Zmc2V0cyB0byBtYWtlIHRoZSB0ZXh0IGNlbnRlcmVkIGF0CiAgICAgIC8vIHRoZSBwcmVmZXJyZWQgcG9zaXRpb24uCgogICAgICAvLyBUaGlzIGlzIHNpbXBseSBoYWxmIG9mIHRoZSB3aWR0aC4KICAgICAgdmFyIGZpbGxUZXh0T2Zmc2V0WCA9IC0gZncgLyAyOwogICAgICAvLyBJbnN0ZWFkIG9mIG1vdmluZyB0aGUgYm94IHRvIHRoZSBleGFjdCBtaWRkbGUgb2YgdGhlIHByZWZlcnJlZAogICAgICAvLyBwb3NpdGlvbiwgZm9yIFktb2Zmc2V0IHdlIG1vdmUgMC40IGluc3RlYWQsIHNvIExhdGluIGFscGhhYmV0cyBsb29rCiAgICAgIC8vIHZlcnRpY2FsIGNlbnRlcmVkLgogICAgICB2YXIgZmlsbFRleHRPZmZzZXRZID0gLSBmaCAqIDAuNDsKCiAgICAgIC8vIENhbGN1bGF0ZSB0aGUgYWN0dWFsIGRpbWVuc2lvbiBvZiB0aGUgY2FudmFzLCBjb25zaWRlcmluZyB0aGUgcm90YXRpb24uCiAgICAgIHZhciBjZ2ggPSBNYXRoLmNlaWwoKGJveFdpZHRoICogTWF0aC5hYnMoTWF0aC5zaW4ocm90YXRlRGVnKSkgKwogICAgICAgICAgICAgICAgICAgICAgICAgICBib3hIZWlnaHQgKiBNYXRoLmFicyhNYXRoLmNvcyhyb3RhdGVEZWcpKSkgLyBnKTsKICAgICAgdmFyIGNndyA9IE1hdGguY2VpbCgoYm94V2lkdGggKiBNYXRoLmFicyhNYXRoLmNvcyhyb3RhdGVEZWcpKSArCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGJveEhlaWdodCAqIE1hdGguYWJzKE1hdGguc2luKHJvdGF0ZURlZykpKSAvIGcpOwogICAgICB2YXIgd2lkdGggPSBjZ3cgKiBnOwogICAgICB2YXIgaGVpZ2h0ID0gY2doICogZzsKCiAgICAgIGZjYW52YXMuc2V0QXR0cmlidXRlKCd3aWR0aCcsIHdpZHRoKTsKICAgICAgZmNhbnZhcy5zZXRBdHRyaWJ1dGUoJ2hlaWdodCcsIGhlaWdodCk7CgogICAgICBpZiAoZGVidWcpIHsKICAgICAgICAvLyBBdHRhY2ggZmNhbnZhcyB0byB0aGUgRE9NCiAgICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChmY2FudmFzKTsKICAgICAgICAvLyBTYXZlIGl0J3Mgc3RhdGUgc28gdGhhdCB3ZSBjb3VsZCByZXN0b3JlIGFuZCBkcmF3IHRoZSBncmlkIGNvcnJlY3RseS4KICAgICAgICBmY3R4LnNhdmUoKTsKICAgICAgfQoKICAgICAgLy8gU2NhbGUgdGhlIGNhbnZhcyB3aXRoIHxtdXwuCiAgICAgIGZjdHguc2NhbGUoMSAvIG11LCAxIC8gbXUpOwogICAgICBmY3R4LnRyYW5zbGF0ZSh3aWR0aCAqIG11IC8gMiwgaGVpZ2h0ICogbXUgLyAyKTsKICAgICAgZmN0eC5yb3RhdGUoLSByb3RhdGVEZWcpOwoKICAgICAgLy8gT25jZSB0aGUgd2lkdGgvaGVpZ2h0IGlzIHNldCwgY3R4IGluZm8gd2lsbCBiZSByZXNldC4KICAgICAgLy8gU2V0IGl0IGFnYWluIGhlcmUuCiAgICAgIGZjdHguZm9udCA9IHNldHRpbmdzLmZvbnRXZWlnaHQgKyAnICcgKwogICAgICAgIChmb250U2l6ZSAqIG11KS50b1N0cmluZygxMCkgKyAncHggJyArIHNldHRpbmdzLmZvbnRGYW1pbHk7CgogICAgICAvLyBGaWxsIHRoZSB0ZXh0IGludG8gdGhlIGZjYW52YXMuCiAgICAgIC8vIFhYWDogV2UgY2Fubm90IGJlY2F1c2UgdGV4dEJhc2VsaW5lID0gJ3RvcCcgaGVyZSBiZWNhdXNlCiAgICAgIC8vIEZpcmVmb3ggYW5kIENocm9tZSB1c2VzIGRpZmZlcmVudCBkZWZhdWx0IGxpbmUtaGVpZ2h0IGZvciBjYW52YXMuCiAgICAgIC8vIFBsZWFzZSByZWFkIGh0dHBzOi8vYnVnemlsLmxhLzczNzg1MiNjNi4KICAgICAgLy8gSGVyZSwgd2UgdXNlIHRleHRCYXNlbGluZSA9ICdtaWRkbGUnIGFuZCBkcmF3IHRoZSB0ZXh0IGF0IGV4YWN0bHkKICAgICAgLy8gMC41ICogZm9udFNpemUgbG93ZXIuCiAgICAgIGZjdHguZmlsbFN0eWxlID0gJyMwMDAnOwogICAgICBmY3R4LnRleHRCYXNlbGluZSA9ICdtaWRkbGUnOwogICAgICBmY3R4LmZpbGxUZXh0KHdvcmQsIGZpbGxUZXh0T2Zmc2V0WCAqIG11LAogICAgICAgICAgICAgICAgICAgIChmaWxsVGV4dE9mZnNldFkgKyBmb250U2l6ZSAqIDAuNSkgKiBtdSk7CgogICAgICAvLyBHZXQgdGhlIHBpeGVscyBvZiB0aGUgdGV4dAogICAgICB2YXIgaW1hZ2VEYXRhID0gZmN0eC5nZXRJbWFnZURhdGEoMCwgMCwgd2lkdGgsIGhlaWdodCkuZGF0YTsKCiAgICAgIGlmIChleGNlZWRUaW1lKCkpIHsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgIH0KCiAgICAgIGlmIChkZWJ1ZykgewogICAgICAgIC8vIERyYXcgdGhlIGJveCBvZiB0aGUgb3JpZ2luYWwgZXN0aW1hdGlvbgogICAgICAgIGZjdHguc3Ryb2tlUmVjdChmaWxsVGV4dE9mZnNldFggKiBtdSwKICAgICAgICAgICAgICAgICAgICAgICAgZmlsbFRleHRPZmZzZXRZLCBmdyAqIG11LCBmaCAqIG11KTsKICAgICAgICBmY3R4LnJlc3RvcmUoKTsKICAgICAgfQoKICAgICAgLy8gUmVhZCB0aGUgcGl4ZWxzIGFuZCBzYXZlIHRoZSBpbmZvcm1hdGlvbiB0byB0aGUgb2NjdXBpZWQgYXJyYXkKICAgICAgdmFyIG9jY3VwaWVkID0gW107CiAgICAgIHZhciBneCA9IGNndywgZ3ksIHgsIHk7CiAgICAgIHZhciBib3VuZHMgPSBbY2doIC8gMiwgY2d3IC8gMiwgY2doIC8gMiwgY2d3IC8gMl07CiAgICAgIHdoaWxlIChneC0tKSB7CiAgICAgICAgZ3kgPSBjZ2g7CiAgICAgICAgd2hpbGUgKGd5LS0pIHsKICAgICAgICAgIHkgPSBnOwogICAgICAgICAgc2luZ2xlR3JpZExvb3A6IHsKICAgICAgICAgICAgd2hpbGUgKHktLSkgewogICAgICAgICAgICAgIHggPSBnOwogICAgICAgICAgICAgIHdoaWxlICh4LS0pIHsKICAgICAgICAgICAgICAgIGlmIChpbWFnZURhdGFbKChneSAqIGcgKyB5KSAqIHdpZHRoICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChneCAqIGcgKyB4KSkgKiA0ICsgM10pIHsKICAgICAgICAgICAgICAgICAgb2NjdXBpZWQucHVzaChbZ3gsIGd5XSk7CgogICAgICAgICAgICAgICAgICBpZiAoZ3ggPCBib3VuZHNbM10pIHsKICAgICAgICAgICAgICAgICAgICBib3VuZHNbM10gPSBneDsKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICBpZiAoZ3ggPiBib3VuZHNbMV0pIHsKICAgICAgICAgICAgICAgICAgICBib3VuZHNbMV0gPSBneDsKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICBpZiAoZ3kgPCBib3VuZHNbMF0pIHsKICAgICAgICAgICAgICAgICAgICBib3VuZHNbMF0gPSBneTsKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICBpZiAoZ3kgPiBib3VuZHNbMl0pIHsKICAgICAgICAgICAgICAgICAgICBib3VuZHNbMl0gPSBneTsKICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgaWYgKGRlYnVnKSB7CiAgICAgICAgICAgICAgICAgICAgZmN0eC5maWxsU3R5bGUgPSAncmdiYSgyNTUsIDAsIDAsIDAuNSknOwogICAgICAgICAgICAgICAgICAgIGZjdHguZmlsbFJlY3QoZ3ggKiBnLCBneSAqIGcsIGcgLSAwLjUsIGcgLSAwLjUpOwogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIGJyZWFrIHNpbmdsZUdyaWRMb29wOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoZGVidWcpIHsKICAgICAgICAgICAgICBmY3R4LmZpbGxTdHlsZSA9ICdyZ2JhKDAsIDAsIDI1NSwgMC41KSc7CiAgICAgICAgICAgICAgZmN0eC5maWxsUmVjdChneCAqIGcsIGd5ICogZywgZyAtIDAuNSwgZyAtIDAuNSk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KCiAgICAgIGlmIChkZWJ1ZykgewogICAgICAgIGZjdHguZmlsbFN0eWxlID0gJ3JnYmEoMCwgMjU1LCAwLCAwLjUpJzsKICAgICAgICBmY3R4LmZpbGxSZWN0KGJvdW5kc1szXSAqIGcsCiAgICAgICAgICAgICAgICAgICAgICBib3VuZHNbMF0gKiBnLAogICAgICAgICAgICAgICAgICAgICAgKGJvdW5kc1sxXSAtIGJvdW5kc1szXSArIDEpICogZywKICAgICAgICAgICAgICAgICAgICAgIChib3VuZHNbMl0gLSBib3VuZHNbMF0gKyAxKSAqIGcpOwogICAgICB9CgogICAgICAvLyBSZXR1cm4gaW5mb3JtYXRpb24gbmVlZGVkIHRvIGNyZWF0ZSB0aGUgdGV4dCBvbiB0aGUgcmVhbCBjYW52YXMKICAgICAgcmV0dXJuIHsKICAgICAgICBtdTogbXUsCiAgICAgICAgb2NjdXBpZWQ6IG9jY3VwaWVkLAogICAgICAgIGJvdW5kczogYm91bmRzLAogICAgICAgIGd3OiBjZ3csCiAgICAgICAgZ2g6IGNnaCwKICAgICAgICBmaWxsVGV4dE9mZnNldFg6IGZpbGxUZXh0T2Zmc2V0WCwKICAgICAgICBmaWxsVGV4dE9mZnNldFk6IGZpbGxUZXh0T2Zmc2V0WSwKICAgICAgICBmaWxsVGV4dFdpZHRoOiBmdywKICAgICAgICBmaWxsVGV4dEhlaWdodDogZmgsCiAgICAgICAgZm9udFNpemU6IGZvbnRTaXplCiAgICAgIH07CiAgICB9OwoKICAgIC8qIERldGVybWluZSBpZiB0aGVyZSBpcyByb29tIGF2YWlsYWJsZSBpbiB0aGUgZ2l2ZW4gZGltZW5zaW9uICovCiAgICB2YXIgY2FuRml0VGV4dCA9IGZ1bmN0aW9uIGNhbkZpdFRleHQoZ3gsIGd5LCBndywgZ2gsIG9jY3VwaWVkKSB7CiAgICAgIC8vIEdvIHRocm91Z2ggdGhlIG9jY3VwaWVkIHBvaW50cywKICAgICAgLy8gcmV0dXJuIGZhbHNlIGlmIHRoZSBzcGFjZSBpcyBub3QgYXZhaWxhYmxlLgogICAgICB2YXIgaSA9IG9jY3VwaWVkLmxlbmd0aDsKICAgICAgd2hpbGUgKGktLSkgewogICAgICAgIHZhciBweCA9IGd4ICsgb2NjdXBpZWRbaV1bMF07CiAgICAgICAgdmFyIHB5ID0gZ3kgKyBvY2N1cGllZFtpXVsxXTsKCiAgICAgICAgaWYgKHB4ID49IG5neCB8fCBweSA+PSBuZ3kgfHwgcHggPCAwIHx8IHB5IDwgMCB8fCAhZ3JpZFtweF1bcHldKSB7CiAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQogICAgICB9CiAgICAgIHJldHVybiB0cnVlOwogICAgfTsKCiAgICAvKiBBY3R1YWxseSBkcmF3IHRoZSB0ZXh0IG9uIHRoZSBncmlkICovCiAgICB2YXIgZHJhd1RleHQgPSBmdW5jdGlvbiBkcmF3VGV4dChneCwgZ3ksIGluZm8sIHdvcmQsIHdlaWdodCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc3RhbmNlLCB0aGV0YSwgcm90YXRlRGVnLCBhdHRyaWJ1dGVzKSB7CgogICAgICB2YXIgZm9udFNpemUgPSBpbmZvLmZvbnRTaXplOwogICAgICB2YXIgY29sb3I7CiAgICAgIGlmIChnZXRUZXh0Q29sb3IpIHsKICAgICAgICBjb2xvciA9IGdldFRleHRDb2xvcih3b3JkLCB3ZWlnaHQsIGZvbnRTaXplLCBkaXN0YW5jZSwgdGhldGEpOwogICAgICB9IGVsc2UgaWYgKHNldHRpbmdzLmNvbG9yIGluc3RhbmNlb2YgQXJyYXkpIHsKICAgICAgICBjb2xvciA9IHNldHRpbmdzLmNvbG9yLnNoaWZ0KCkgfHwgJ2JsYWNrJzsgLy8gcGFzcyBhIGFycmF5IGluIHNldHRpbmcsIGRlZmF1bHQgJ2JsYWNrJwogICAgICB9IGVsc2UgewogICAgICAgIGNvbG9yID0gc2V0dGluZ3MuY29sb3I7CiAgICAgIH0KCiAgICAgIHZhciBjbGFzc2VzOwogICAgICBpZiAoZ2V0VGV4dENsYXNzZXMpIHsKICAgICAgICBjbGFzc2VzID0gZ2V0VGV4dENsYXNzZXMod29yZCwgd2VpZ2h0LCBmb250U2l6ZSwgZGlzdGFuY2UsIHRoZXRhKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBjbGFzc2VzID0gc2V0dGluZ3MuY2xhc3NlczsKICAgICAgfQoKICAgICAgdmFyIGRpbWVuc2lvbjsKICAgICAgdmFyIGJvdW5kcyA9IGluZm8uYm91bmRzOwogICAgICBkaW1lbnNpb24gPSB7CiAgICAgICAgeDogKGd4ICsgYm91bmRzWzNdKSAqIGcsCiAgICAgICAgeTogKGd5ICsgYm91bmRzWzBdKSAqIGcsCiAgICAgICAgdzogKGJvdW5kc1sxXSAtIGJvdW5kc1szXSArIDEpICogZywKICAgICAgICBoOiAoYm91bmRzWzJdIC0gYm91bmRzWzBdICsgMSkgKiBnCiAgICAgIH07CgogICAgICBlbGVtZW50cy5mb3JFYWNoKGZ1bmN0aW9uKGVsKSB7CiAgICAgICAgaWYgKGVsLmdldENvbnRleHQpIHsKICAgICAgICAgIHZhciBjdHggPSBlbC5nZXRDb250ZXh0KCcyZCcpOwogICAgICAgICAgdmFyIG11ID0gaW5mby5tdTsKCiAgICAgICAgICAvLyBTYXZlIHRoZSBjdXJyZW50IHN0YXRlIGJlZm9yZSBtZXNzaW5nIGl0CiAgICAgICAgICBjdHguc2F2ZSgpOwogICAgICAgICAgY3R4LnNjYWxlKDEgLyBtdSwgMSAvIG11KTsKCiAgICAgICAgICBjdHguZm9udCA9IHNldHRpbmdzLmZvbnRXZWlnaHQgKyAnICcgKwogICAgICAgICAgICAgICAgICAgICAoZm9udFNpemUgKiBtdSkudG9TdHJpbmcoMTApICsgJ3B4ICcgKyBzZXR0aW5ncy5mb250RmFtaWx5OwogICAgICAgICAgY3R4LmZpbGxTdHlsZSA9IGNvbG9yOwoKICAgICAgICAgIC8vIFRyYW5zbGF0ZSB0aGUgY2FudmFzIHBvc2l0aW9uIHRvIHRoZSBvcmlnaW4gY29vcmRpbmF0ZSBvZiB3aGVyZQogICAgICAgICAgLy8gdGhlIHRleHQgc2hvdWxkIGJlIHB1dC4KICAgICAgICAgIGN0eC50cmFuc2xhdGUoKGd4ICsgaW5mby5ndyAvIDIpICogZyAqIG11LAogICAgICAgICAgICAgICAgICAgICAgICAoZ3kgKyBpbmZvLmdoIC8gMikgKiBnICogbXUpOwoKICAgICAgICAgIGlmIChyb3RhdGVEZWcgIT09IDApIHsKICAgICAgICAgICAgY3R4LnJvdGF0ZSgtIHJvdGF0ZURlZyk7CiAgICAgICAgICB9CgogICAgICAgICAgLy8gRmluYWxseSwgZmlsbCB0aGUgdGV4dC4KCiAgICAgICAgICAvLyBYWFg6IFdlIGNhbm5vdCBiZWNhdXNlIHRleHRCYXNlbGluZSA9ICd0b3AnIGhlcmUgYmVjYXVzZQogICAgICAgICAgLy8gRmlyZWZveCBhbmQgQ2hyb21lIHVzZXMgZGlmZmVyZW50IGRlZmF1bHQgbGluZS1oZWlnaHQgZm9yIGNhbnZhcy4KICAgICAgICAgIC8vIFBsZWFzZSByZWFkIGh0dHBzOi8vYnVnemlsLmxhLzczNzg1MiNjNi4KICAgICAgICAgIC8vIEhlcmUsIHdlIHVzZSB0ZXh0QmFzZWxpbmUgPSAnbWlkZGxlJyBhbmQgZHJhdyB0aGUgdGV4dCBhdCBleGFjdGx5CiAgICAgICAgICAvLyAwLjUgKiBmb250U2l6ZSBsb3dlci4KICAgICAgICAgIGN0eC50ZXh0QmFzZWxpbmUgPSAnbWlkZGxlJzsKICAgICAgICAgIGN0eC5maWxsVGV4dCh3b3JkLCBpbmZvLmZpbGxUZXh0T2Zmc2V0WCAqIG11LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbmZvLmZpbGxUZXh0T2Zmc2V0WSArIGZvbnRTaXplICogMC41KSAqIG11KTsKCiAgICAgICAgICAvLyBUaGUgYmVsb3cgYm94IGlzIGFsd2F5cyBtYXRjaGVzIGhvdyA8c3Bhbj5zIGFyZSBwb3NpdGlvbmVkCiAgICAgICAgICAvKiBjdHguc3Ryb2tlUmVjdChpbmZvLmZpbGxUZXh0T2Zmc2V0WCwgaW5mby5maWxsVGV4dE9mZnNldFksCiAgICAgICAgICAgIGluZm8uZmlsbFRleHRXaWR0aCwgaW5mby5maWxsVGV4dEhlaWdodCk7ICovCgogICAgICAgICAgLy8gUmVzdG9yZSB0aGUgc3RhdGUuCiAgICAgICAgICBjdHgucmVzdG9yZSgpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAvLyBkcmF3VGV4dCBvbiBESVYgZWxlbWVudAogICAgICAgICAgdmFyIHNwYW4gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzcGFuJyk7CiAgICAgICAgICB2YXIgdHJhbnNmb3JtUnVsZSA9ICcnOwogICAgICAgICAgdHJhbnNmb3JtUnVsZSA9ICdyb3RhdGUoJyArICgtIHJvdGF0ZURlZyAvIE1hdGguUEkgKiAxODApICsgJ2RlZykgJzsKICAgICAgICAgIGlmIChpbmZvLm11ICE9PSAxKSB7CiAgICAgICAgICAgIHRyYW5zZm9ybVJ1bGUgKz0KICAgICAgICAgICAgICAndHJhbnNsYXRlWCgtJyArIChpbmZvLmZpbGxUZXh0V2lkdGggLyA0KSArICdweCkgJyArCiAgICAgICAgICAgICAgJ3NjYWxlKCcgKyAoMSAvIGluZm8ubXUpICsgJyknOwogICAgICAgICAgfQogICAgICAgICAgdmFyIHN0eWxlUnVsZXMgPSB7CiAgICAgICAgICAgICdwb3NpdGlvbic6ICdhYnNvbHV0ZScsCiAgICAgICAgICAgICdkaXNwbGF5JzogJ2Jsb2NrJywKICAgICAgICAgICAgJ2ZvbnQnOiBzZXR0aW5ncy5mb250V2VpZ2h0ICsgJyAnICsKICAgICAgICAgICAgICAgICAgICAoZm9udFNpemUgKiBpbmZvLm11KSArICdweCAnICsgc2V0dGluZ3MuZm9udEZhbWlseSwKICAgICAgICAgICAgJ2xlZnQnOiAoKGd4ICsgaW5mby5ndyAvIDIpICogZyArIGluZm8uZmlsbFRleHRPZmZzZXRYKSArICdweCcsCiAgICAgICAgICAgICd0b3AnOiAoKGd5ICsgaW5mby5naCAvIDIpICogZyArIGluZm8uZmlsbFRleHRPZmZzZXRZKSArICdweCcsCiAgICAgICAgICAgICd3aWR0aCc6IGluZm8uZmlsbFRleHRXaWR0aCArICdweCcsCiAgICAgICAgICAgICdoZWlnaHQnOiBpbmZvLmZpbGxUZXh0SGVpZ2h0ICsgJ3B4JywKICAgICAgICAgICAgJ2xpbmVIZWlnaHQnOiBmb250U2l6ZSArICdweCcsCiAgICAgICAgICAgICd3aGl0ZVNwYWNlJzogJ25vd3JhcCcsCiAgICAgICAgICAgICd0cmFuc2Zvcm0nOiB0cmFuc2Zvcm1SdWxlLAogICAgICAgICAgICAnd2Via2l0VHJhbnNmb3JtJzogdHJhbnNmb3JtUnVsZSwKICAgICAgICAgICAgJ21zVHJhbnNmb3JtJzogdHJhbnNmb3JtUnVsZSwKICAgICAgICAgICAgJ3RyYW5zZm9ybU9yaWdpbic6ICc1MCUgNDAlJywKICAgICAgICAgICAgJ3dlYmtpdFRyYW5zZm9ybU9yaWdpbic6ICc1MCUgNDAlJywKICAgICAgICAgICAgJ21zVHJhbnNmb3JtT3JpZ2luJzogJzUwJSA0MCUnCiAgICAgICAgICB9OwogICAgICAgICAgaWYgKGNvbG9yKSB7CiAgICAgICAgICAgIHN0eWxlUnVsZXMuY29sb3IgPSBjb2xvcjsKICAgICAgICAgIH0KICAgICAgICAgIHNwYW4udGV4dENvbnRlbnQgPSB3b3JkOwogICAgICAgICAgZm9yICh2YXIgY3NzUHJvcCBpbiBzdHlsZVJ1bGVzKSB7CiAgICAgICAgICAgIHNwYW4uc3R5bGVbY3NzUHJvcF0gPSBzdHlsZVJ1bGVzW2Nzc1Byb3BdOwogICAgICAgICAgfQogICAgICAgICAgaWYgKGF0dHJpYnV0ZXMpIHsKICAgICAgICAgICAgZm9yICh2YXIgYXR0cmlidXRlIGluIGF0dHJpYnV0ZXMpIHsKICAgICAgICAgICAgICBzcGFuLnNldEF0dHJpYnV0ZShhdHRyaWJ1dGUsIGF0dHJpYnV0ZXNbYXR0cmlidXRlXSk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIGlmIChjbGFzc2VzKSB7CiAgICAgICAgICAgIHNwYW4uY2xhc3NOYW1lICs9IGNsYXNzZXM7CiAgICAgICAgICB9CiAgICAgICAgICBlbC5hcHBlbmRDaGlsZChzcGFuKTsKICAgICAgICB9CiAgICAgIH0pOwogICAgfTsKCiAgICAvKiBIZWxwIGZ1bmN0aW9uIHRvIHVwZGF0ZUdyaWQgKi8KICAgIHZhciBmaWxsR3JpZEF0ID0gZnVuY3Rpb24gZmlsbEdyaWRBdCh4LCB5LCBkcmF3TWFzaywgZGltZW5zaW9uLCBpdGVtKSB7CiAgICAgIGlmICh4ID49IG5neCB8fCB5ID49IG5neSB8fCB4IDwgMCB8fCB5IDwgMCkgewogICAgICAgIHJldHVybjsKICAgICAgfQoKICAgICAgZ3JpZFt4XVt5XSA9IGZhbHNlOwoKICAgICAgaWYgKGRyYXdNYXNrKSB7CiAgICAgICAgdmFyIGN0eCA9IGVsZW1lbnRzWzBdLmdldENvbnRleHQoJzJkJyk7CiAgICAgICAgY3R4LmZpbGxSZWN0KHggKiBnLCB5ICogZywgbWFza1JlY3RXaWR0aCwgbWFza1JlY3RXaWR0aCk7CiAgICAgIH0KCiAgICAgIGlmIChpbnRlcmFjdGl2ZSkgewogICAgICAgIGluZm9HcmlkW3hdW3ldID0geyBpdGVtOiBpdGVtLCBkaW1lbnNpb246IGRpbWVuc2lvbiB9OwogICAgICB9CiAgICB9OwoKICAgIC8qIFVwZGF0ZSB0aGUgZmlsbGluZyBpbmZvcm1hdGlvbiBvZiB0aGUgZ2l2ZW4gc3BhY2Ugd2l0aCBvY2N1cGllZCBwb2ludHMuCiAgICAgICBEcmF3IHRoZSBtYXNrIG9uIHRoZSBjYW52YXMgaWYgbmVjZXNzYXJ5LiAqLwogICAgdmFyIHVwZGF0ZUdyaWQgPSBmdW5jdGlvbiB1cGRhdGVHcmlkKGd4LCBneSwgZ3csIGdoLCBpbmZvLCBpdGVtKSB7CiAgICAgIHZhciBvY2N1cGllZCA9IGluZm8ub2NjdXBpZWQ7CiAgICAgIHZhciBkcmF3TWFzayA9IHNldHRpbmdzLmRyYXdNYXNrOwogICAgICB2YXIgY3R4OwogICAgICBpZiAoZHJhd01hc2spIHsKICAgICAgICBjdHggPSBlbGVtZW50c1swXS5nZXRDb250ZXh0KCcyZCcpOwogICAgICAgIGN0eC5zYXZlKCk7CiAgICAgICAgY3R4LmZpbGxTdHlsZSA9IHNldHRpbmdzLm1hc2tDb2xvcjsKICAgICAgfQoKICAgICAgdmFyIGRpbWVuc2lvbjsKICAgICAgaWYgKGludGVyYWN0aXZlKSB7CiAgICAgICAgdmFyIGJvdW5kcyA9IGluZm8uYm91bmRzOwogICAgICAgIGRpbWVuc2lvbiA9IHsKICAgICAgICAgIHg6IChneCArIGJvdW5kc1szXSkgKiBnLAogICAgICAgICAgeTogKGd5ICsgYm91bmRzWzBdKSAqIGcsCiAgICAgICAgICB3OiAoYm91bmRzWzFdIC0gYm91bmRzWzNdICsgMSkgKiBnLAogICAgICAgICAgaDogKGJvdW5kc1syXSAtIGJvdW5kc1swXSArIDEpICogZwogICAgICAgIH07CiAgICAgIH0KCiAgICAgIHZhciBpID0gb2NjdXBpZWQubGVuZ3RoOwogICAgICB3aGlsZSAoaS0tKSB7CiAgICAgICAgZmlsbEdyaWRBdChneCArIG9jY3VwaWVkW2ldWzBdLCBneSArIG9jY3VwaWVkW2ldWzFdLAogICAgICAgICAgICAgICAgICAgZHJhd01hc2ssIGRpbWVuc2lvbiwgaXRlbSk7CiAgICAgIH0KCiAgICAgIGlmIChkcmF3TWFzaykgewogICAgICAgIGN0eC5yZXN0b3JlKCk7CiAgICAgIH0KICAgIH07CgogICAgLyogcHV0V29yZCgpIHByb2Nlc3NlcyBlYWNoIGl0ZW0gb24gdGhlIGxpc3QsCiAgICAgICBjYWxjdWxhdGUgaXQncyBzaXplIGFuZCBkZXRlcm1pbmUgaXQncyBwb3NpdGlvbiwgYW5kIGFjdHVhbGx5CiAgICAgICBwdXQgaXQgb24gdGhlIGNhbnZhcy4gKi8KICAgIHZhciBwdXRXb3JkID0gZnVuY3Rpb24gcHV0V29yZChpdGVtKSB7CiAgICAgIHZhciB3b3JkLCB3ZWlnaHQsIGF0dHJpYnV0ZXM7CiAgICAgIGlmIChBcnJheS5pc0FycmF5KGl0ZW0pKSB7CiAgICAgICAgd29yZCA9IGl0ZW1bMF07CiAgICAgICAgd2VpZ2h0ID0gaXRlbVsxXTsKICAgICAgfSBlbHNlIHsKICAgICAgICB3b3JkID0gaXRlbS53b3JkOwogICAgICAgIHdlaWdodCA9IGl0ZW0ud2VpZ2h0OwogICAgICAgIGF0dHJpYnV0ZXMgPSBpdGVtLmF0dHJpYnV0ZXM7CiAgICAgIH0KICAgICAgdmFyIHJvdGF0ZURlZyA9IGdldFJvdGF0ZURlZygpOwoKICAgICAgLy8gZ2V0IGluZm8gbmVlZGVkIHRvIHB1dCB0aGUgdGV4dCBvbnRvIHRoZSBjYW52YXMKICAgICAgdmFyIGluZm8gPSBnZXRUZXh0SW5mbyh3b3JkLCB3ZWlnaHQsIHJvdGF0ZURlZyk7CgogICAgICAvLyBub3QgZ2V0dGluZyB0aGUgaW5mbyBtZWFucyB3ZSBzaG91bGRuJ3QgYmUgZHJhd2luZyB0aGlzIG9uZS4KICAgICAgaWYgKCFpbmZvKSB7CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICB9CgogICAgICBpZiAoZXhjZWVkVGltZSgpKSB7CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICB9CgogICAgICAvLyBTa2lwIHRoZSBsb29wIGlmIHdlIGhhdmUgYWxyZWFkeSBrbm93IHRoZSBib3VuZGluZyBib3ggb2YKICAgICAgLy8gd29yZCBpcyBsYXJnZXIgdGhhbiB0aGUgY2FudmFzLgogICAgICB2YXIgYm91bmRzID0gaW5mby5ib3VuZHM7CiAgICAgIGlmICgoYm91bmRzWzFdIC0gYm91bmRzWzNdICsgMSkgPiBuZ3ggfHwKICAgICAgICAoYm91bmRzWzJdIC0gYm91bmRzWzBdICsgMSkgPiBuZ3kpIHsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgIH0KCiAgICAgIC8vIERldGVybWluZSB0aGUgcG9zaXRpb24gdG8gcHV0IHRoZSB0ZXh0IGJ5CiAgICAgIC8vIHN0YXJ0IGxvb2tpbmcgZm9yIHRoZSBuZWFyZXN0IHBvaW50cwogICAgICB2YXIgciA9IG1heFJhZGl1cyArIDE7CgogICAgICB2YXIgdHJ5VG9QdXRXb3JkQXRQb2ludCA9IGZ1bmN0aW9uKGd4eSkgewogICAgICAgIHZhciBneCA9IE1hdGguZmxvb3IoZ3h5WzBdIC0gaW5mby5ndyAvIDIpOwogICAgICAgIHZhciBneSA9IE1hdGguZmxvb3IoZ3h5WzFdIC0gaW5mby5naCAvIDIpOwogICAgICAgIHZhciBndyA9IGluZm8uZ3c7CiAgICAgICAgdmFyIGdoID0gaW5mby5naDsKCiAgICAgICAgLy8gSWYgd2UgY2Fubm90IGZpdCB0aGUgdGV4dCBhdCB0aGlzIHBvc2l0aW9uLCByZXR1cm4gZmFsc2UKICAgICAgICAvLyBhbmQgZ28gdG8gdGhlIG5leHQgcG9zaXRpb24uCiAgICAgICAgaWYgKCFjYW5GaXRUZXh0KGd4LCBneSwgZ3csIGdoLCBpbmZvLm9jY3VwaWVkKSkgewogICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KCiAgICAgICAgLy8gQWN0dWFsbHkgcHV0IHRoZSB0ZXh0IG9uIHRoZSBjYW52YXMKICAgICAgICBkcmF3VGV4dChneCwgZ3ksIGluZm8sIHdvcmQsIHdlaWdodCwKICAgICAgICAgICAgICAgICAobWF4UmFkaXVzIC0gciksIGd4eVsyXSwgcm90YXRlRGVnLCBhdHRyaWJ1dGVzKTsKCiAgICAgICAgLy8gTWFyayB0aGUgc3BhY2VzIG9uIHRoZSBncmlkIGFzIGZpbGxlZAogICAgICAgIHVwZGF0ZUdyaWQoZ3gsIGd5LCBndywgZ2gsIGluZm8sIGl0ZW0pOwoKICAgICAgICAvLyBSZXR1cm4gdHJ1ZSBzbyBzb21lKCkgd2lsbCBzdG9wIGFuZCBhbHNvIHJldHVybiB0cnVlLgogICAgICAgIHJldHVybiB0cnVlOwogICAgICB9OwoKICAgICAgd2hpbGUgKHItLSkgewogICAgICAgIHZhciBwb2ludHMgPSBnZXRQb2ludHNBdFJhZGl1cyhtYXhSYWRpdXMgLSByKTsKCiAgICAgICAgaWYgKHNldHRpbmdzLnNodWZmbGUpIHsKICAgICAgICAgIHBvaW50cyA9IFtdLmNvbmNhdChwb2ludHMpOwogICAgICAgICAgc2h1ZmZsZUFycmF5KHBvaW50cyk7CiAgICAgICAgfQoKICAgICAgICAvLyBUcnkgdG8gZml0IHRoZSB3b3JkcyBieSBsb29raW5nIGF0IGVhY2ggcG9pbnQuCiAgICAgICAgLy8gYXJyYXkuc29tZSgpIHdpbGwgc3RvcCBhbmQgcmV0dXJuIHRydWUKICAgICAgICAvLyB3aGVuIHB1dFdvcmRBdFBvaW50KCkgcmV0dXJucyB0cnVlLgogICAgICAgIC8vIElmIGFsbCB0aGUgcG9pbnRzIHJldHVybnMgZmFsc2UsIGFycmF5LnNvbWUoKSByZXR1cm5zIGZhbHNlLgogICAgICAgIHZhciBkcmF3biA9IHBvaW50cy5zb21lKHRyeVRvUHV0V29yZEF0UG9pbnQpOwoKICAgICAgICBpZiAoZHJhd24pIHsKICAgICAgICAgIC8vIGxlYXZlIHB1dFdvcmQoKSBhbmQgcmV0dXJuIHRydWUKICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0KICAgICAgfQogICAgICAvLyB3ZSB0cmllZCBhbGwgZGlzdGFuY2VzIGJ1dCB0ZXh0IHdvbid0IGZpdCwgcmV0dXJuIGZhbHNlCiAgICAgIHJldHVybiBmYWxzZTsKICAgIH07CgogICAgLyogU2VuZCBET00gZXZlbnQgdG8gYWxsIGVsZW1lbnRzLiBXaWxsIHN0b3Agc2VuZGluZyBldmVudCBhbmQgcmV0dXJuCiAgICAgICBpZiB0aGUgcHJldmlvdXMgb25lIGlzIGNhbmNlbGVkIChmb3IgY2FuY2VsYWJsZSBldmVudHMpLiAqLwogICAgdmFyIHNlbmRFdmVudCA9IGZ1bmN0aW9uIHNlbmRFdmVudCh0eXBlLCBjYW5jZWxhYmxlLCBkZXRhaWwpIHsKICAgICAgaWYgKGNhbmNlbGFibGUpIHsKICAgICAgICByZXR1cm4gIWVsZW1lbnRzLnNvbWUoZnVuY3Rpb24oZWwpIHsKICAgICAgICAgIHZhciBldnQgPSBkb2N1bWVudC5jcmVhdGVFdmVudCgnQ3VzdG9tRXZlbnQnKTsKICAgICAgICAgIGV2dC5pbml0Q3VzdG9tRXZlbnQodHlwZSwgdHJ1ZSwgY2FuY2VsYWJsZSwgZGV0YWlsIHx8IHt9KTsKICAgICAgICAgIHJldHVybiAhZWwuZGlzcGF0Y2hFdmVudChldnQpOwogICAgICAgIH0sIHRoaXMpOwogICAgICB9IGVsc2UgewogICAgICAgIGVsZW1lbnRzLmZvckVhY2goZnVuY3Rpb24oZWwpIHsKICAgICAgICAgIHZhciBldnQgPSBkb2N1bWVudC5jcmVhdGVFdmVudCgnQ3VzdG9tRXZlbnQnKTsKICAgICAgICAgIGV2dC5pbml0Q3VzdG9tRXZlbnQodHlwZSwgdHJ1ZSwgY2FuY2VsYWJsZSwgZGV0YWlsIHx8IHt9KTsKICAgICAgICAgIGVsLmRpc3BhdGNoRXZlbnQoZXZ0KTsKICAgICAgICB9LCB0aGlzKTsKICAgICAgfQogICAgfTsKCiAgICAvKiBTdGFydCBkcmF3aW5nIG9uIGEgY2FudmFzICovCiAgICB2YXIgc3RhcnQgPSBmdW5jdGlvbiBzdGFydCgpIHsKICAgICAgLy8gRm9yIGRpbWVuc2lvbnMsIGNsZWFyQ2FudmFzIGV0Yy4sCiAgICAgIC8vIHdlIG9ubHkgY2FyZSBhYm91dCB0aGUgZmlyc3QgZWxlbWVudC4KICAgICAgdmFyIGNhbnZhcyA9IGVsZW1lbnRzWzBdOwoKICAgICAgaWYgKGNhbnZhcy5nZXRDb250ZXh0KSB7CiAgICAgICAgbmd4ID0gTWF0aC5mbG9vcihjYW52YXMud2lkdGggLyBnKTsKICAgICAgICBuZ3kgPSBNYXRoLmZsb29yKGNhbnZhcy5oZWlnaHQgLyBnKTsKICAgICAgfSBlbHNlIHsKICAgICAgICB2YXIgcmVjdCA9IGNhbnZhcy5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTsKICAgICAgICBuZ3ggPSBNYXRoLmZsb29yKHJlY3Qud2lkdGggLyBnKTsKICAgICAgICBuZ3kgPSBNYXRoLmZsb29yKHJlY3QuaGVpZ2h0IC8gZyk7CiAgICAgIH0KCiAgICAgIC8vIFNlbmRpbmcgYSB3b3JkY2xvdWRzdGFydCBldmVudCB3aGljaCBjYXVzZSB0aGUgcHJldmlvdXMgbG9vcCB0byBzdG9wLgogICAgICAvLyBEbyBub3RoaW5nIGlmIHRoZSBldmVudCBpcyBjYW5jZWxlZC4KICAgICAgaWYgKCFzZW5kRXZlbnQoJ3dvcmRjbG91ZHN0YXJ0JywgdHJ1ZSkpIHsKICAgICAgICByZXR1cm47CiAgICAgIH0KCiAgICAgIC8vIERldGVybWluZSB0aGUgY2VudGVyIG9mIHRoZSB3b3JkIGNsb3VkCiAgICAgIGNlbnRlciA9IChzZXR0aW5ncy5vcmlnaW4pID8KICAgICAgICBbc2V0dGluZ3Mub3JpZ2luWzBdL2csIHNldHRpbmdzLm9yaWdpblsxXS9nXSA6CiAgICAgICAgW25neCAvIDIsIG5neSAvIDJdOwoKICAgICAgLy8gTWF4aXVtIHJhZGl1cyB0byBsb29rIGZvciBzcGFjZQogICAgICBtYXhSYWRpdXMgPSBNYXRoLmZsb29yKE1hdGguc3FydChuZ3ggKiBuZ3ggKyBuZ3kgKiBuZ3kpKTsKCiAgICAgIC8qIENsZWFyIHRoZSBjYW52YXMgb25seSBpZiB0aGUgY2xlYXJDYW52YXMgaXMgc2V0LAogICAgICAgICBpZiBub3QsIHVwZGF0ZSB0aGUgZ3JpZCB0byB0aGUgY3VycmVudCBjYW52YXMgc3RhdGUgKi8KICAgICAgZ3JpZCA9IFtdOwoKICAgICAgdmFyIGd4LCBneSwgaTsKICAgICAgaWYgKCFjYW52YXMuZ2V0Q29udGV4dCB8fCBzZXR0aW5ncy5jbGVhckNhbnZhcykgewogICAgICAgIGVsZW1lbnRzLmZvckVhY2goZnVuY3Rpb24oZWwpIHsKICAgICAgICAgIGlmIChlbC5nZXRDb250ZXh0KSB7CiAgICAgICAgICAgIHZhciBjdHggPSBlbC5nZXRDb250ZXh0KCcyZCcpOwogICAgICAgICAgICBjdHguZmlsbFN0eWxlID0gc2V0dGluZ3MuYmFja2dyb3VuZENvbG9yOwogICAgICAgICAgICBjdHguY2xlYXJSZWN0KDAsIDAsIG5neCAqIChnICsgMSksIG5neSAqIChnICsgMSkpOwogICAgICAgICAgICBjdHguZmlsbFJlY3QoMCwgMCwgbmd4ICogKGcgKyAxKSwgbmd5ICogKGcgKyAxKSk7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBlbC50ZXh0Q29udGVudCA9ICcnOwogICAgICAgICAgICBlbC5zdHlsZS5iYWNrZ3JvdW5kQ29sb3IgPSBzZXR0aW5ncy5iYWNrZ3JvdW5kQ29sb3I7CiAgICAgICAgICB9CiAgICAgICAgfSk7CgogICAgICAgIC8qIGZpbGwgdGhlIGdyaWQgd2l0aCBlbXB0eSBzdGF0ZSAqLwogICAgICAgIGd4ID0gbmd4OwogICAgICAgIHdoaWxlIChneC0tKSB7CiAgICAgICAgICBncmlkW2d4XSA9IFtdOwogICAgICAgICAgZ3kgPSBuZ3k7CiAgICAgICAgICB3aGlsZSAoZ3ktLSkgewogICAgICAgICAgICBncmlkW2d4XVtneV0gPSB0cnVlOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfSBlbHNlIHsKICAgICAgICAvKiBEZXRlcm1pbmUgYmdQaXhlbCBieSBjcmVhdGluZwogICAgICAgICAgIGFub3RoZXIgY2FudmFzIGFuZCBmaWxsIHRoZSBzcGVjaWZpZWQgYmFja2dyb3VuZCBjb2xvci4gKi8KICAgICAgICB2YXIgYmN0eCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2NhbnZhcycpLmdldENvbnRleHQoJzJkJyk7CgogICAgICAgIGJjdHguZmlsbFN0eWxlID0gc2V0dGluZ3MuYmFja2dyb3VuZENvbG9yOwogICAgICAgIGJjdHguZmlsbFJlY3QoMCwgMCwgMSwgMSk7CiAgICAgICAgdmFyIGJnUGl4ZWwgPSBiY3R4LmdldEltYWdlRGF0YSgwLCAwLCAxLCAxKS5kYXRhOwoKICAgICAgICAvKiBSZWFkIGJhY2sgdGhlIHBpeGVscyBvZiB0aGUgY2FudmFzIHdlIGdvdCB0byB0ZWxsIHdoaWNoIHBhcnQgb2YgdGhlCiAgICAgICAgICAgY2FudmFzIGlzIGVtcHR5LgogICAgICAgICAgIChubyBjbGVhckNhbnZhcyBvbmx5IHdvcmtzIHdpdGggYSBjYW52YXMsIG5vdCBkaXZzKSAqLwogICAgICAgIHZhciBpbWFnZURhdGEgPQogICAgICAgICAgY2FudmFzLmdldENvbnRleHQoJzJkJykuZ2V0SW1hZ2VEYXRhKDAsIDAsIG5neCAqIGcsIG5neSAqIGcpLmRhdGE7CgogICAgICAgIGd4ID0gbmd4OwogICAgICAgIHZhciB4LCB5OwogICAgICAgIHdoaWxlIChneC0tKSB7CiAgICAgICAgICBncmlkW2d4XSA9IFtdOwogICAgICAgICAgZ3kgPSBuZ3k7CiAgICAgICAgICB3aGlsZSAoZ3ktLSkgewogICAgICAgICAgICB5ID0gZzsKICAgICAgICAgICAgc2luZ2xlR3JpZExvb3A6IHdoaWxlICh5LS0pIHsKICAgICAgICAgICAgICB4ID0gZzsKICAgICAgICAgICAgICB3aGlsZSAoeC0tKSB7CiAgICAgICAgICAgICAgICBpID0gNDsKICAgICAgICAgICAgICAgIHdoaWxlIChpLS0pIHsKICAgICAgICAgICAgICAgICAgaWYgKGltYWdlRGF0YVsoKGd5ICogZyArIHkpICogbmd4ICogZyArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChneCAqIGcgKyB4KSkgKiA0ICsgaV0gIT09IGJnUGl4ZWxbaV0pIHsKICAgICAgICAgICAgICAgICAgICBncmlkW2d4XVtneV0gPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICBicmVhayBzaW5nbGVHcmlkTG9vcDsKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoZ3JpZFtneF1bZ3ldICE9PSBmYWxzZSkgewogICAgICAgICAgICAgIGdyaWRbZ3hdW2d5XSA9IHRydWU7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGltYWdlRGF0YSA9IGJjdHggPSBiZ1BpeGVsID0gdW5kZWZpbmVkOwogICAgICB9CgogICAgICAvLyBmaWxsIHRoZSBpbmZvR3JpZCB3aXRoIGVtcHR5IHN0YXRlIGlmIHdlIG5lZWQgaXQKICAgICAgaWYgKHNldHRpbmdzLmhvdmVyIHx8IHNldHRpbmdzLmNsaWNrKSB7CgogICAgICAgIGludGVyYWN0aXZlID0gdHJ1ZTsKCiAgICAgICAgLyogZmlsbCB0aGUgZ3JpZCB3aXRoIGVtcHR5IHN0YXRlICovCiAgICAgICAgZ3ggPSBuZ3ggKyAxOwogICAgICAgIHdoaWxlIChneC0tKSB7CiAgICAgICAgICBpbmZvR3JpZFtneF0gPSBbXTsKICAgICAgICB9CgogICAgICAgIGlmIChzZXR0aW5ncy5ob3ZlcikgewogICAgICAgICAgY2FudmFzLmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsIHdvcmRjbG91ZGhvdmVyKTsKICAgICAgICB9CgogICAgICAgIGlmIChzZXR0aW5ncy5jbGljaykgewogICAgICAgICAgY2FudmFzLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgd29yZGNsb3VkY2xpY2spOwogICAgICAgICAgY2FudmFzLmFkZEV2ZW50TGlzdGVuZXIoJ3RvdWNoc3RhcnQnLCB3b3JkY2xvdWRjbGljayk7CiAgICAgICAgICBjYW52YXMuYWRkRXZlbnRMaXN0ZW5lcigndG91Y2hlbmQnLCBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7CiAgICAgICAgICB9KTsKICAgICAgICAgIGNhbnZhcy5zdHlsZS53ZWJraXRUYXBIaWdobGlnaHRDb2xvciA9ICdyZ2JhKDAsIDAsIDAsIDApJzsKICAgICAgICB9CgogICAgICAgIGNhbnZhcy5hZGRFdmVudExpc3RlbmVyKCd3b3JkY2xvdWRzdGFydCcsIGZ1bmN0aW9uIHN0b3BJbnRlcmFjdGlvbigpIHsKICAgICAgICAgIGNhbnZhcy5yZW1vdmVFdmVudExpc3RlbmVyKCd3b3JkY2xvdWRzdGFydCcsIHN0b3BJbnRlcmFjdGlvbik7CgogICAgICAgICAgY2FudmFzLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsIHdvcmRjbG91ZGhvdmVyKTsKICAgICAgICAgIGNhbnZhcy5yZW1vdmVFdmVudExpc3RlbmVyKCdjbGljaycsIHdvcmRjbG91ZGNsaWNrKTsKICAgICAgICAgIGhvdmVyZWQgPSB1bmRlZmluZWQ7CiAgICAgICAgfSk7CiAgICAgIH0KCiAgICAgIGkgPSAwOwogICAgICB2YXIgbG9vcGluZ0Z1bmN0aW9uLCBzdG9wcGluZ0Z1bmN0aW9uOwogICAgICBpZiAoc2V0dGluZ3Mud2FpdCAhPT0gMCkgewogICAgICAgIGxvb3BpbmdGdW5jdGlvbiA9IHdpbmRvdy5zZXRUaW1lb3V0OwogICAgICAgIHN0b3BwaW5nRnVuY3Rpb24gPSB3aW5kb3cuY2xlYXJUaW1lb3V0OwogICAgICB9IGVsc2UgewogICAgICAgIGxvb3BpbmdGdW5jdGlvbiA9IHdpbmRvdy5zZXRJbW1lZGlhdGU7CiAgICAgICAgc3RvcHBpbmdGdW5jdGlvbiA9IHdpbmRvdy5jbGVhckltbWVkaWF0ZTsKICAgICAgfQoKICAgICAgdmFyIGFkZEV2ZW50TGlzdGVuZXIgPSBmdW5jdGlvbiBhZGRFdmVudExpc3RlbmVyKHR5cGUsIGxpc3RlbmVyKSB7CiAgICAgICAgZWxlbWVudHMuZm9yRWFjaChmdW5jdGlvbihlbCkgewogICAgICAgICAgZWwuYWRkRXZlbnRMaXN0ZW5lcih0eXBlLCBsaXN0ZW5lcik7CiAgICAgICAgfSwgdGhpcyk7CiAgICAgIH07CgogICAgICB2YXIgcmVtb3ZlRXZlbnRMaXN0ZW5lciA9IGZ1bmN0aW9uIHJlbW92ZUV2ZW50TGlzdGVuZXIodHlwZSwgbGlzdGVuZXIpIHsKICAgICAgICBlbGVtZW50cy5mb3JFYWNoKGZ1bmN0aW9uKGVsKSB7CiAgICAgICAgICBlbC5yZW1vdmVFdmVudExpc3RlbmVyKHR5cGUsIGxpc3RlbmVyKTsKICAgICAgICB9LCB0aGlzKTsKICAgICAgfTsKCiAgICAgIHZhciBhbm90aGVyV29yZENsb3VkU3RhcnQgPSBmdW5jdGlvbiBhbm90aGVyV29yZENsb3VkU3RhcnQoKSB7CiAgICAgICAgcmVtb3ZlRXZlbnRMaXN0ZW5lcignd29yZGNsb3Vkc3RhcnQnLCBhbm90aGVyV29yZENsb3VkU3RhcnQpOwogICAgICAgIHN0b3BwaW5nRnVuY3Rpb24odGltZXIpOwogICAgICB9OwoKICAgICAgYWRkRXZlbnRMaXN0ZW5lcignd29yZGNsb3Vkc3RhcnQnLCBhbm90aGVyV29yZENsb3VkU3RhcnQpOwoKICAgICAgdmFyIHRpbWVyID0gbG9vcGluZ0Z1bmN0aW9uKGZ1bmN0aW9uIGxvb3AoKSB7CiAgICAgICAgaWYgKGkgPj0gc2V0dGluZ3MubGlzdC5sZW5ndGgpIHsKICAgICAgICAgIHN0b3BwaW5nRnVuY3Rpb24odGltZXIpOwogICAgICAgICAgc2VuZEV2ZW50KCd3b3JkY2xvdWRzdG9wJywgZmFsc2UpOwogICAgICAgICAgcmVtb3ZlRXZlbnRMaXN0ZW5lcignd29yZGNsb3Vkc3RhcnQnLCBhbm90aGVyV29yZENsb3VkU3RhcnQpOwoKICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgZXNjYXBlVGltZSA9IChuZXcgRGF0ZSgpKS5nZXRUaW1lKCk7CiAgICAgICAgdmFyIGRyYXduID0gcHV0V29yZChzZXR0aW5ncy5saXN0W2ldKTsKICAgICAgICB2YXIgY2FuY2VsZWQgPSAhc2VuZEV2ZW50KCd3b3JkY2xvdWRkcmF3bicsIHRydWUsIHsKICAgICAgICAgIGl0ZW06IHNldHRpbmdzLmxpc3RbaV0sIGRyYXduOiBkcmF3biB9KTsKICAgICAgICBpZiAoZXhjZWVkVGltZSgpIHx8IGNhbmNlbGVkKSB7CiAgICAgICAgICBzdG9wcGluZ0Z1bmN0aW9uKHRpbWVyKTsKICAgICAgICAgIHNldHRpbmdzLmFib3J0KCk7CiAgICAgICAgICBzZW5kRXZlbnQoJ3dvcmRjbG91ZGFib3J0JywgZmFsc2UpOwogICAgICAgICAgc2VuZEV2ZW50KCd3b3JkY2xvdWRzdG9wJywgZmFsc2UpOwogICAgICAgICAgcmVtb3ZlRXZlbnRMaXN0ZW5lcignd29yZGNsb3Vkc3RhcnQnLCBhbm90aGVyV29yZENsb3VkU3RhcnQpOwogICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICBpKys7CiAgICAgICAgdGltZXIgPSBsb29waW5nRnVuY3Rpb24obG9vcCwgc2V0dGluZ3Mud2FpdCk7CiAgICAgIH0sIHNldHRpbmdzLndhaXQpOwogICAgfTsKCiAgICAvLyBBbGwgc2V0LCBzdGFydCB0aGUgZHJhd2luZwogICAgc3RhcnQoKTsKICB9OwoKICBXb3JkQ2xvdWQuaXNTdXBwb3J0ZWQgPSBpc1N1cHBvcnRlZDsKICBXb3JkQ2xvdWQubWluRm9udFNpemUgPSBtaW5Gb250U2l6ZTsKCiAgLy8gRXhwb3NlIHRoZSBsaWJyYXJ5IGFzIGFuIEFNRCBtb2R1bGUKICBpZiAodHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kKSB7CiAgICBkZWZpbmUoJ3dvcmRjbG91ZCcsIFtdLCBmdW5jdGlvbigpIHsgcmV0dXJuIFdvcmRDbG91ZDsgfSk7CiAgfSBlbHNlIGlmICh0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJyAmJiBtb2R1bGUuZXhwb3J0cykgewogICAgbW9kdWxlLmV4cG9ydHMgPSBXb3JkQ2xvdWQ7CiAgfSBlbHNlIHsKICAgIGdsb2JhbC5Xb3JkQ2xvdWQgPSBXb3JkQ2xvdWQ7CiAgfQoKfSkodGhpcyk7IC8vanNoaW50IGlnbm9yZTpsaW5lCg==\"></script>\n",
       "<script title=\"wordcloud2\" src=\"data:application/javascript;base64,Ly8gY3JlYXRlIGVsZW1lbnQKZnVuY3Rpb24gbmV3bGFiZWwoZWwpewogIHZhciBuZXdEaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTsKICB2YXIgbmV3U3BhbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNwYW4iKTsKICBuZXdEaXYuaWQgPSAnd2NMYWJlbCc7CiAgbmV3U3Bhbi5pZCA9ICJ3Y1NwYW4iOwogIGVsLmFwcGVuZENoaWxkKG5ld0Rpdik7CiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoIndjTGFiZWwiKS5hcHBlbmRDaGlsZChuZXdTcGFuKTsKfQoKLy8gaG92ZXIgZnVuY3Rpb24KZnVuY3Rpb24gY3ZfaGFuZGxlSG92ZXIoaXRlbSwgZGltZW5zaW9uLCBldnQpIHsKICB2YXIgZWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgid2NMYWJlbCIpOwogIGlmICghaXRlbSkgewogICAgZWwuc2V0QXR0cmlidXRlKCdoaWRkZW4nLCB0cnVlKTsKCiAgICByZXR1cm47CiAgfQoKICBlbC5yZW1vdmVBdHRyaWJ1dGUoJ2hpZGRlbicpOwogIC8vIGNvbnNvbGUubG9nKGV2dC5zcmNFbGVtZW50Lm9mZnNldExlZnQpOwoKICBlbC5zdHlsZS5sZWZ0ID0gZGltZW5zaW9uLnggKyBldnQuc3JjRWxlbWVudC5vZmZzZXRMZWZ0ICsgJ3B4JzsKICBlbC5zdHlsZS50b3AgPSBkaW1lbnNpb24ueSArIGV2dC5zcmNFbGVtZW50Lm9mZnNldFRvcCArICdweCc7CiAgZWwuc3R5bGUud2lkdGggPSBkaW1lbnNpb24udyArICdweCc7CiAgZWwuc3R5bGUuaGVpZ2h0ID0gZGltZW5zaW9uLmggKyAncHgnOwoKICB0aGlzLmhvdmVyRGltZW5zaW9uID0gZGltZW5zaW9uOwoKICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgid2NTcGFuIikuc2V0QXR0cmlidXRlKAogICAgJ2RhdGEtbDEwbi1hcmdzJywgSlNPTi5zdHJpbmdpZnkoeyB3b3JkOiBpdGVtWzBdLCBjb3VudDogaXRlbVsxXSB9KSk7CiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoIndjU3BhbiIpLmlubmVySFRNTCA9aXRlbVswXSsiOiIgKyBpdGVtWzFdOwoKfQoKZnVuY3Rpb24gdXBkYXRlQ2FudmFzTWFzayhtYXNrQ2FudmFzKSB7CiAgICB2YXIgY3R4ID0gbWFza0NhbnZhcy5nZXRDb250ZXh0KCcyZCcpOwogICAgdmFyIGltYWdlRGF0YSA9IGN0eC5nZXRJbWFnZURhdGEoCiAgICAgICAgMCwgMCwgbWFza0NhbnZhcy53aWR0aCwgbWFza0NhbnZhcy5oZWlnaHQpOwogICAgdmFyIG5ld0ltYWdlRGF0YSA9IGN0eC5jcmVhdGVJbWFnZURhdGEoaW1hZ2VEYXRhKTsKCiAgICB2YXIgdG9uZVN1bSA9IDA7CiAgICB2YXIgdG9uZUNudCA9IDA7CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGltYWdlRGF0YS5kYXRhLmxlbmd0aDsgaSArPSA0KSB7CiAgICAgICAgdmFyIGFscGhhID0gaW1hZ2VEYXRhLmRhdGFbaSArIDNdOwogICAgICAgIGlmIChhbHBoYSA+IDEyOCkgewogICAgICAgICAgICB2YXIgdG9uZSA9IGltYWdlRGF0YS5kYXRhW2ldCiAgICAgICAgICAgICAgICArIGltYWdlRGF0YS5kYXRhW2kgKyAxXQogICAgICAgICAgICAgICAgKyBpbWFnZURhdGEuZGF0YVtpICsgMl07CiAgICAgICAgICAgIHRvbmVTdW0gKz0gdG9uZTsKICAgICAgICAgICAgKyt0b25lQ250OwogICAgICAgIH0KICAgIH0KICAgIHZhciB0aHJlc2hvbGQgPSB0b25lU3VtIC8gdG9uZUNudDsKCiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGltYWdlRGF0YS5kYXRhLmxlbmd0aDsgaSArPSA0KSB7CiAgICAgICAgdmFyIHRvbmUgPSBpbWFnZURhdGEuZGF0YVtpXQogICAgICAgICAgICArIGltYWdlRGF0YS5kYXRhW2kgKyAxXQogICAgICAgICAgICArIGltYWdlRGF0YS5kYXRhW2kgKyAyXTsKICAgICAgICB2YXIgYWxwaGEgPSBpbWFnZURhdGEuZGF0YVtpICsgM107CgogICAgICAgIGlmIChhbHBoYSA8IDEyOCB8fCB0b25lID4gdGhyZXNob2xkKSB7CiAgICAgICAgICAgIC8vIEFyZWEgbm90IHRvIGRyYXcKICAgICAgICAgICAgbmV3SW1hZ2VEYXRhLmRhdGFbaV0gPSAwOwogICAgICAgICAgICBuZXdJbWFnZURhdGEuZGF0YVtpICsgMV0gPSAwOwogICAgICAgICAgICBuZXdJbWFnZURhdGEuZGF0YVtpICsgMl0gPSAwOwogICAgICAgICAgICBuZXdJbWFnZURhdGEuZGF0YVtpICsgM10gPSAwOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgLy8gQXJlYSB0byBkcmF3CiAgICAgICAgICAgIC8vIFRoZSBjb2xvciBtdXN0IGJlIHNhbWUgd2l0aCBiYWNrZ3JvdW5kQ29sb3IKICAgICAgICAgICAgbmV3SW1hZ2VEYXRhLmRhdGFbaV0gPSAyNTU7CiAgICAgICAgICAgIG5ld0ltYWdlRGF0YS5kYXRhW2kgKyAxXSA9IDI1NTsKICAgICAgICAgICAgbmV3SW1hZ2VEYXRhLmRhdGFbaSArIDJdID0gMjU1OwogICAgICAgICAgICBuZXdJbWFnZURhdGEuZGF0YVtpICsgM10gPSAyNTU7CiAgICAgICAgfQogICAgfQoKICAgIGN0eC5wdXRJbWFnZURhdGEobmV3SW1hZ2VEYXRhLCAwLCAwKTsKICAgIGNvbnNvbGUubG9nKG1hc2tDYW52YXMudG9EYXRhVVJMKCkpOwp9CgoKCi8vbWFzayBmdW5jdGlvbgpmdW5jdGlvbiBtYXNrSW5pdChlbCx4KXsKICBjb25zb2xlLmxvZygxKQogIHN0ciA9IHguZmlnQmFzZTY0OwogIC8vY29uc29sZS5sb2coc3RyKQogIHZhciBuZXdJbWcgPSBuZXcgSW1hZ2UoKTsKICBuZXdJbWcuc3JjID0gc3RyOwogIG5ld0ltZy5zdHlsZS5wb3NpdGlvbiA9ICdhYnNvbHV0ZSc7CiAgbmV3SW1nLnN0eWxlLmxlZnQgPSAwOwogIC8vIGNvbnNvbGUubG9nKGVsLmNsaWVudEhlaWdodCk7CiAgbmV3SW1nLndpZHRoID0gZWwuY2xpZW50V2lkdGg7CiAgbmV3SW1nLmhlaWdodCA9IGVsLmNsaWVudEhlaWdodDsKICAvLyBtYXNrQ2FudmFzID0gaW5pdChlbCwgeCwgbmV3SW1nKTsKICB2dmFsdWUgPSAxMjgKCiAgY3R4ID0gZWwuZmlyc3RDaGlsZC5nZXRDb250ZXh0KCcyZCcpOwoKICAgICAgICAgICAgICAgIGN0eC5kcmF3SW1hZ2UobmV3SW1nLCAwLCAwLCBjYW52YXMud2lkdGgsIGNhbnZhcy5oZWlnaHQpOwogICAgICAgICAgICAgICAgdXBkYXRlQ2FudmFzTWFzayhjdHgpOwoKCgoKCiAgICAgICAgICAgIFdvcmRDbG91ZChlbC5maXJzdENoaWxkLCB7IGxpc3Q6IGxpc3REYXRhLAogICAgICAgICAgICAgICAgICBmb250RmFtaWx5OiB4LmZvbnRGYW1pbHksCiAgICAgICAgICAgICAgICAgIGZvbnRXZWlnaHQ6IHguZm9udFdlaWdodCwKICAgICAgICAgICAgICAgICAgY29sb3I6IHguY29sb3IsCiAgICAgICAgICAgICAgICAgIG1pblNpemU6IHgubWluU2l6ZSwKICAgICAgICAgICAgICAgICAgd2VpZ2h0RmFjdG9yOiB4LndlaWdodEZhY3RvciwKICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZENvbG9yOiB4LmJhY2tncm91bmRDb2xvciwKICAgICAgICAgICAgICAgICAgZ3JpZFNpemU6IHguZ3JpZFNpemUsCiAgICAgICAgICAgICAgICAgIG1pblJvdGF0aW9uOiB4Lm1pblJvdGF0aW9uLAogICAgICAgICAgICAgICAgICBtYXhSb3RhdGlvbjogeC5tYXhSb3RhdGlvbiwKICAgICAgICAgICAgICAgICAgc2h1ZmZsZTogeC5zaHVmZmxlLAogICAgICAgICAgICAgICAgICBzaGFwZTogeC5zaGFwZSwKICAgICAgICAgICAgICAgICAgcm90YXRlUmF0aW86IHgucm90YXRlUmF0aW8sCiAgICAgICAgICAgICAgICAgIGVsbGlwdGljaXR5OiB4LmVsbGlwdGljaXR5LAogICAgICAgICAgICAgICAgICBjbGVhckNhbnZhczogZmFsc2UsCiAgICAgICAgICAgICAgICAgIGRyYXdNYXNrOiB0cnVlLAogICAgICAgICAgICAgICAgICBob3ZlcjogeC5ob3ZlciB8fCBjdl9oYW5kbGVIb3ZlciwKICAgICAgICAgICAgICAgICAgYWJvcnRUaHJlc2hvbGQ6IDMwMDAKICAgICAgICAgICAgICAgICAgfSk7Cn0KCg==\"></script>\n",
       "<link href=\"data:text/css;charset-utf-8;base64,DQojd2NMYWJlbCB7DQogIHBvc2l0aW9uOiBhYnNvbHV0ZTsNCiAgYm9yZGVyOiAycHggc29saWQgI2ZmZjsNCiAgYm94LXNoYWRvdzogMCAwIDRweCAwICMwMDg7DQogIHBhZGRpbmc6IDJweDsNCiAgLyptYXJnaW46IC00cHggMCAwIC00cHg7Ki8NCiAgcG9pbnRlci1ldmVudHM6IG5vbmU7IH0NCg0KI3djU3BhbiB7DQogIHBvc2l0aW9uOiBhYnNvbHV0ZTsNCiAgdG9wOiAxMDAlOw0KICBsZWZ0OiAwOw0KICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuOCk7DQogIGNvbG9yOiAjMzMzOw0KICBtYXJnaW4tdG9wOiA2cHg7DQogIHBhZGRpbmc6IDAgMC41ZW07DQogIGJvcmRlci1yYWRpdXM6IDAuNWVtOw0KICB3aGl0ZS1zcGFjZTogbm93cmFwOyB9DQo=\" rel=\"stylesheet\" />\n",
       "<script title=\"wordcloud2-binding\" src=\"data:application/javascript;base64,SFRNTFdpZGdldHMud2lkZ2V0KHsKCiAgbmFtZTogJ3dvcmRjbG91ZDInLAoKICB0eXBlOiAnb3V0cHV0JywKCiAgaW5pdGlhbGl6ZTogZnVuY3Rpb24oZWwsIHdpZHRoLCBoZWlnaHQpIHsKICAgIHZhciBuZXdDYW52YXMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJjYW52YXMiKTsKICAgIG5ld0NhbnZhcy5oZWlnaHQgPSBoZWlnaHQ7CiAgICBuZXdDYW52YXMud2lkdGggPSB3aWR0aDsKICAgIG5ld0NhbnZhcy5pZCA9ICJjYW52YXMiOwoKICAgIGVsLmFwcGVuZENoaWxkKG5ld0NhbnZhcyk7CiAgICBuZXdsYWJlbChlbCk7CiAgICByZXR1cm4oZWwuZmlyc3RDaGlsZCk7CiAgfSwKICByZW5kZXJWYWx1ZTogZnVuY3Rpb24oZWwsIHgsIGluc3RhbmNlKSB7CiAgLy8gcGFyc2UgZ2V4ZiBkYXRhCiAgICAgICAgbGlzdERhdGE9W107CiAgICAgICAgZm9yKHZhciBpPTA7IGk8eC53b3JkLmxlbmd0aDsgaSsrKXsKICAgICAgICAgIGxpc3REYXRhLnB1c2goW3gud29yZFtpXSwgeC5mcmVxW2ldXSk7CiAgICAgICAgfQogICAgIGlmKHguZmlnQmFzZTY0KXsKCiAgICAgICAgbWFza0luaXQoZWwseCk7CiAgICAgICAgY29uc29sZS5sb2coMykKCiAgICAgIH1lbHNlewogICAgICAgIFdvcmRDbG91ZChlbC5maXJzdENoaWxkLCB7IGxpc3Q6IGxpc3REYXRhLAogICAgICAgICAgICAgICAgICAgICAgICBmb250RmFtaWx5OiB4LmZvbnRGYW1pbHksCiAgICAgICAgICAgICAgICAgICAgICAgIGZvbnRXZWlnaHQ6IHguZm9udFdlaWdodCwKICAgICAgICAgICAgICAgICAgICAgICAgY29sb3I6IHguY29sb3IsCiAgICAgICAgICAgICAgICAgICAgICAgIG1pblNpemU6IHgubWluU2l6ZSwKICAgICAgICAgICAgICAgICAgICAgICAgd2VpZ2h0RmFjdG9yOiB4LndlaWdodEZhY3RvciwKICAgICAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZENvbG9yOiB4LmJhY2tncm91bmRDb2xvciwKICAgICAgICAgICAgICAgICAgICAgICAgZ3JpZFNpemU6IHguZ3JpZFNpemUsCiAgICAgICAgICAgICAgICAgICAgICAgIG1pblJvdGF0aW9uOiB4Lm1pblJvdGF0aW9uLAogICAgICAgICAgICAgICAgICAgICAgICBtYXhSb3RhdGlvbjogeC5tYXhSb3RhdGlvbiwKICAgICAgICAgICAgICAgICAgICAgICAgc2h1ZmZsZTogeC5zaHVmZmxlLAogICAgICAgICAgICAgICAgICAgICAgICBzaGFwZTogeC5zaGFwZSwKICAgICAgICAgICAgICAgICAgICAgICAgcm90YXRlUmF0aW86IHgucm90YXRlUmF0aW8sCiAgICAgICAgICAgICAgICAgICAgICAgIGVsbGlwdGljaXR5OiB4LmVsbGlwdGljaXR5LAogICAgICAgICAgICAgICAgICAgICAgICBkcmF3TWFzazogeC5kcmF3TWFzaywKICAgICAgICAgICAgICAgICAgICAgICAgbWFza0NvbG9yOiB4Lm1hc2tDb2xvciwKICAgICAgICAgICAgICAgICAgICAgICAgbWFza0dhcFdpZHRoOiB4Lm1hc2tHYXBXaWR0aCwKICAgICAgICAgICAgICAgICAgICAgICAgaG92ZXI6IHguaG92ZXIgfHwgY3ZfaGFuZGxlSG92ZXIKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgIH0KICAgIH0sCiAgICAgIHJlc2l6ZTogZnVuY3Rpb24oZWwsIHdpZHRoLCBoZWlnaHQpIHsKICAgICAgfQoKfSk7Cg==\"></script>\n",
       "\t</head>\n",
       "\t<body>\n",
       "\t\t<div id=\"htmlwidget-8d0053e0f6038f26e709\" style=\"width:960px;height:500px;\" class=\"wordcloud2 html-widget\"></div>\n",
       "<script type=\"application/json\" data-for=\"htmlwidget-8d0053e0f6038f26e709\">{\"x\":{\"word\":[\"善良\",\"故事\",\"每个\",\"太\",\"没有\",\"世界\",\"孩子\",\"视角\",\"奇迹\",\"姐姐\",\"温暖\",\"家庭\",\"男孩\",\"成长\",\"朋友\",\"哭\",\"真的\",\"爱\",\"角色\",\"喜欢\",\"选择\",\"非常\",\"父母\",\"美好\",\"鸡汤\",\"感动\",\"可爱\",\"小男孩\",\"觉得\",\"生活\",\"看到\",\"人生\",\"暖\",\"片\",\"特别\",\"励志\",\"善意\",\"想\",\"不同\",\"温情\",\"影片\",\"正确\",\"这部\",\"人物\",\"现实\",\"真实\",\"教育\",\"煽情\",\"友情\",\"奥吉\",\"正\",\"片子\",\"这种\",\"之间\",\"套路\",\"没\",\"治愈\",\"童话\",\"希望\",\"导演\",\"应该\",\"感觉\",\"知道\",\"社会\",\"能量\",\"剧情\",\"尊重\",\"有点\",\"苦战\",\"儿童\",\"其实\",\"几个\",\"叙事\",\"同学\",\"好看\",\"很多\",\"成为\",\"老师\",\"主角\",\"地方\",\"妈妈\",\"感人\",\"星战\",\"暖心\",\"温馨\",\"需要\",\"Auggie\",\"不会\",\"不错\",\"完\",\"小孩\",\"感受\",\"打动\",\"最后\",\"身边\",\"周围\",\"学校\",\"家人\",\"容易\",\"小演员\",\"情感\",\"演技\",\"真是\",\"重要\",\"一定\",\"完美\",\"家长\",\"男主\",\"畸形\",\"相信\",\"眼泪\",\"经历\",\"美国\",\"观众\",\"讲述\",\"适合\",\"配角\",\"里面\",\"Jack\",\"JackWill\",\"亲情\",\"依然\",\"值得\",\"小孩子\",\"心\",\"方式\",\"校长\",\"真\",\"真正\",\"简单\",\"这是\",\"雅各布\",\"不能\",\"也许\",\"俗套\",\"充满\",\"刻意\",\"围绕\",\"存在\",\"孤独\",\"愿意\",\"拍\",\"挺\",\"校园\",\"残酷\",\"温柔\",\"理想化\",\"真善美\",\"角度\",\"讲\",\"走\",\"身上\",\"面对\",\"一起\",\"三星\",\"丰富\",\"主题\",\"关注\",\"内心\",\"半\",\"友谊\",\"天生\",\"完全\",\"少年\",\"影院\",\"心理\",\"所有人\",\"接受\",\"改变\",\"梗\",\"永远\",\"演\",\"演员\",\"理解\",\"结构\",\"话\",\"过于\",\"问题\",\"面部\",\"2\",\"Jacob\",\"一下\",\"一次\",\"一直\",\"不幸\",\"了解\",\"事\",\"人心\",\"冬日\",\"善待\",\"头盔\",\"实在\",\"小朋友\",\"式\",\"戏\",\"找到\",\"推荐\",\"整个\",\"普通\",\"最好\",\"有人\",\"欧文\",\"特殊\",\"环境\",\"看待\",\"类型\",\"细节\",\"聪明\",\"转换\",\"那种\",\"️\",\"不要\",\"中国\",\"人性\",\"从头\",\"伟大\",\"催泪\",\"友善\",\"发现\",\"台词\",\"后面\",\"喝\",\"好人\",\"已经\",\"弟弟\",\"很棒\",\"总是\",\"戳\",\"政治\",\"更好\",\"来看\",\"杰克\",\"泪点\",\"点\",\"片中\",\"简直\",\"结尾\",\"背后\",\"脸\",\"表演\",\"表现\",\"起来\",\"遇到\",\"难得\",\"霸凌\",\"35\",\"wonder\",\"一面\",\"上学\",\"与众不同\",\"两个\",\"之外\",\"事情\",\"今天\",\"保持\",\"像是\",\"前\",\"剧本\",\"努力\",\"勇气\",\"原来\",\"只能\",\"可能\",\"周遭\",\"善\",\"坚强\",\"外表\",\"好莱坞\",\"完整\",\"宽容\",\"尤其\",\"尾\",\"带\",\"幻想\",\"强行\",\"心灵\",\"总\",\"恶意\",\"情节\",\"想要\",\"想象\",\"手术\",\"折射出\",\"整部\",\"有点像\",\"有趣\",\"本片\",\"棒\",\"正常\",\"残疾\",\"比较\",\"漂亮\",\"照顾\",\"熟悉\",\"爱情\",\"爸爸\",\"用心\",\"男\",\"看看\",\"真好\",\"第一次\",\"系\",\"纯真\",\"线\",\"美式\",\"能够\",\"脸部\",\"说教\",\"过程\",\"还好\",\"那句\",\"部分\",\"长大\",\"长得\",\"jack\",\"一生\",\"不好\",\"不算\",\"不行\",\"个人\",\"中心\",\"之后\",\"令人\",\"传统\",\"倒\",\"健全\",\"全片\",\"全程\",\"写\",\"几乎\",\"出生\",\"刻画\",\"动人\",\"化妆\",\"原谅\",\"叙述\",\"可惜\",\"呵护\",\"地图\",\"处理\",\"太阳\",\"好好\",\"威尔逊\",\"家里\",\"小时\",\"展现\",\"平淡\",\"幸运\",\"影响\",\"心疼\",\"必须\",\"惊喜\",\"想起\",\"懂事\",\"成\",\"抵抗力\",\"拍得\",\"敏感\",\"教\",\"整体\",\"时间\",\"星\",\"是因为\",\"普通人\",\"更加\",\"最终\",\"未来\",\"本来\",\"每次\",\"毫无\",\"泪目\",\"渴望\",\"狗\",\"理想\",\"甜而不腻\",\"生命\",\"用心看\",\"男主角\",\"相处\",\"看似\",\"真挚\",\"确实\",\"突然\",\"童话故事\",\"笑\",\"细腻\",\"结局\",\"绝对\",\"美\",\"老套\",\"表达\",\"视点\",\"遭遇\",\"闺蜜\",\"青春\",\"题材\",\"1\",\"4\",\"bekind\",\"Miranda\",\"POV\",\"PS\",\"一句\",\"一家\",\"一碗\",\"不到\",\"不少\",\"与人为善\",\"中产\",\"中间\",\"之前\",\"乌托邦\",\"亮点\",\"亲密关系\",\"人人\",\"人类\",\"从小\",\"以后\",\"以待\",\"以貌取人\",\"优秀\",\"传递\",\"伤害\",\"似乎\",\"作品\",\"儿童片\",\"关怀\",\"关系\",\"典型\",\"内容\",\"冲突\",\"出\",\"剧\",\"力\",\"包容\",\"单纯\",\"厉害\",\"原著\",\"反\",\"反派\",\"发生\",\"变化\",\"变成\",\"同样\",\"向往\",\"呈现\",\"命运\",\"嘴\",\"围着\",\"基友\",\"壁\",\"多角度\",\"大概\",\"天使\",\"天赋\",\"嫉妒\",\"学习\",\"家庭教育\",\"容貌\",\"小伙伴\",\"小说\",\"居然\",\"差不多\",\"平等\",\"开心\",\"影帝\",\"必选\",\"怦然心动\",\"总会\",\"总体\",\"恰到好处\",\"情绪\",\"意义\",\"感\",\"感谢\",\"懂\",\"成就\",\"房间\",\"手法\",\"打架\",\"拥抱\",\"插入\",\"放在\",\"放大\",\"教会\",\"无法\",\"最大\",\"會\",\"有意思\",\"有时候\",\"次\",\"欺凌\",\"正义\",\"没想到\",\"注定\",\"泪\",\"泪水\",\"流泪\",\"演得\",\"灵气\"],\"freq\":[102,96,92,58,57,56,56,55,54,51,51,50,44,42,42,41,38,36,36,35,35,35,34,34,33,32,31,31,30,29,29,28,28,28,27,26,26,26,25,25,24,24,24,23,23,23,22,22,21,21,21,21,21,20,20,20,20,20,19,18,18,18,18,18,18,17,17,17,17,16,16,16,16,16,16,16,16,16,15,15,15,15,15,15,15,15,14,14,14,14,14,14,14,14,14,13,13,13,13,13,13,13,13,13,12,12,12,12,12,12,12,12,12,12,12,12,12,12,11,11,11,11,11,11,11,11,11,11,11,11,11,11,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4],\"fontFamily\":\"Segoe UI\",\"fontWeight\":\"bold\",\"color\":\"random-dark\",\"minSize\":0,\"weightFactor\":1.76470588235294,\"backgroundColor\":\"white\",\"gridSize\":0,\"minRotation\":-0.785398163397448,\"maxRotation\":0.785398163397448,\"shuffle\":true,\"rotateRatio\":0.4,\"shape\":\"circle\",\"ellipticity\":0.65,\"figBase64\":null,\"hover\":null},\"evals\":[],\"jsHooks\":{\"render\":[{\"code\":\"function(el,x){\\n                        console.log(123);\\n                        if(!iii){\\n                          window.location.reload();\\n                          iii = False;\\n\\n                        }\\n  }\",\"data\":null}]}}</script>\n",
       "\t</body>\n",
       "</html>\n"
      ],
      "text/plain": [
       "HTML widgets cannot be represented in plain text (need html)"
      ]
     },
     "metadata": {
      "text/html": {
       "isolated": true
      }
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "# 词云图\n",
    "wk = worker(stop_word = 'stopwords-zh.txt')\n",
    "comment_freq <- as.data.frame(table(wk[data$Comment]))\n",
    "comment_freq_sorted <- comment_freq[sort(comment_freq$Freq, decreasing = TRUE, \n",
    "                                         index.return=TRUE)$ix,]\n",
    "top500 <- head(comment_freq_sorted, 500)\n",
    "wordcloud2(top500)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    ">这里好像不能正常显示，见pics文件夹下文件。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 点赞走势"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-09-21T11:06:12.372351Z",
     "start_time": "2019-09-21T11:06:07.403Z"
    }
   },
   "outputs": [
    {
     "data": {
      "image/png": "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\nCCHDGgVCQgghwxoFQkIIIcMaBUJCCCHDGgVCQgghwxoFQkIIIcMaBUJCCCHDGgVCQgghw1o2\nrVA/BG3fvv3222//x3/8x1tvvXWw09IPrr76ainln/70p8FOSL/54osvfvzjH19zzTU33HDD\nYKel3zz00EPvvPOOux7ZYKelL1asWBGJRF5//fXBTki/2bFjx2233XbllVf+4Ac/GOy0kL7I\nstUnhhrHcaLRqGEYg52Q/hGPx3Pswci27Vy6QK50Oh2NRnuwgPsQFY/HY7HYYKeiP+XYfWAY\noqpRQgghwxoFQkIIIcMaVY2elPz8/CVLlkyZMmWwE9I/Fi1alGNVo0VFRUuWLJk8efJgJ6Q/\nzZo1yzRNv98/2Anpo4ULFyaTycFORX8Kh8NLliyZOnXqYCeE9BF1liGEEDKsUdUoIYSQYY2q\nRvvT8uXLu6vzeeONN05xYk5ebmQnN3LRQbZnKtvT31nu5WhYoUB4PI7jrFix4sknnywoKOjJ\ndgAPP/zwuHHj2m6pq6u7/fbbBzytPdA52fF4/MUXX9ywYUM6nZ45c+YNN9wwZsyYtm8Zytnp\nIEsvSney/dI0NTU988wzW7duVRTlzDPPvP7664PBYNsdhnj6j2PXrl333HPPCy+80OGblr05\nIhQIu2Wa5qpVqzoPeOpuu8vn8+Xl5bXdkkgkBiqJvdFlsp9++ul9+/atXLnS7/e/+uqr9957\n71NPPdU2/UM2Ox1k6UU5jqy+NFLKhx9+2Lbtn/3sZ6Zp/va3v3366afvueeetvsM5fQfRzqd\nfuyxx7rsWpGlOSKgQNidN9988/nnn7dtu4fbh7guk51IJNauXXvfffedeeaZAH7605+uWLFi\nw4YNixcvHpxU9lWWXpTjyPZLU1NTs2PHjscff3zixIkArrvuukcffdRxHEVRBjtpJ+u5557z\ner2DnQrSzygQdu3888+fO3fukSNHHnnkkZ5sb3XbbbedkgT2TpfJbmxsnDx58vTp090/dV33\ner1NTU1t3zg0s9NBll6U48j2S5NIJGbPnj1+/Hj3z3A4LKW0LKttIBzK6e/OZ599tnHjxjvu\nuOPnP/9551ezMUfERYGwa+FwOBwOW5bVw+0u0zT/9V//ddSoUW031tbWrly5cqAS2jNdJnvc\nuHGPPfZY658ff/xxNBqdMWNG65Yhm50OsvSiHEe2X5pJkyY99NBDAKSUkUhk9erV8+bN03W9\ndYchnv4uRSKRJ5544q677goEAp1fzcYckVYUCPuNbdu2bRcVFbX9wQPo8OcQ5DjOm2+++cIL\nLyxdurS1FJK92Wkr23OR7Zfmvvvu27p1azgcfvLJJ1s3ZlH6W0kpn3jiiYULF86fP3/fvn0d\nXs3GHJG2KBD2m8rKSgB79+5V1XafaocaraHm8OHDjz766NGjR2+44YZly5a1bs/S7HSQ1bnI\ngUtz5513NjY2/u1vf7vrrruefPJJdzacLEp/q/fee+/IkSM//vGPu3w1G3NE2qJA2G8OHjyo\nadrLL7/cYXt3VXZDwbZt2+6///4zzjjjgQce6NAXPBuz01n25iKrL01tbW08Hp84cWJxcXFx\ncfEdd9yxfPnyLVu2fOUrX0E2pL+z3bt3Hz16dPny5QDcLqPf//73L774Ynd0RDbmiLRFgbDf\nfPDBB1/72tduuummDttra2tvvPHGQUnS8VmW9cgjjyxduvTmm29mjHV4Neuy06UszUW2X5qt\nW7e++OKLL7zwgts7xrIs27Zbe8oM/fR3dvXVV3/jG99w/+92y/qnf/qn1hbBbMwRaYsCYf+o\nqKjYtGnTihUrBjshvbBly5bm5uYpU6Zs3LixdeP48eNLS0uzMTudZW8usv3SLFiw4He/+90T\nTzxxySWX2Lb9l7/8paioaPbs2cjai1JUVFRUVOT+3y3njR071i2pZ2mOSFsUCPtBOp3+5S9/\nec4557ijplo3Njc3c86rq6s9Hs8gJq87bsPG448/3nbjLbfccvHFF2djdjrI0oviyvZLU1BQ\ncP/99z///PP33Xef1+udOXPmgw8+6Pf7s/qidCn3cjQ8USA8nsmTJ3c5T2CH7fv37/d6vR1G\nEaVSqdtvv13X9WAw+K1vfWvA09oDHZJ9+eWXX3755Z1327FjR1Zkp4MsvShdyoFLM3369H/+\n53/usDGrL0qrtt+03MgRoWWY+oeUsnNbTvbKjezkRi46yPZMZXv6O8u9HA1DFAgJIYQMa7Qe\nISGEkGGNAiEhhJBhjQIhIYSQYY0CISGEkGGNAiEhhJBhjQIhIYSQYY0CISGEkGGNAiEh7bzw\nwgusvaKiomXLln300UeDnTRCyICgKdYI6cK3v/1td0V4wzC2bNny/vvvv/XWW7/5zW9uueWW\nnrz9k08+efvtt3/yk5+4K/ARQoYyCoSEdOE73/nOlVde2frnzp07L7vssttvv33ZsmVjxow5\n4ds/+eSTBx54YOXKlRQICRn6qGqUkBObMWPGs88+a5rmww8/PNhpIYT0MwqEhPTI4sWLZ86c\n+ec//7l1yyuvvHL22Wfn5+cHAoG5c+c+9dRT7sy9ixcvvuuuuwCMGDHCXdMcwOHDh5cvX15W\nVhYMBhctWvTaa68NSi4IIZ1RICSkRxhjc+fOra6uTqfTAP793//9mmuuEULcfffdt956K4CV\nK1e+/PLLAB5//PEf/vCHAF577bWf//znAL788svTTz99zZo1y5cv/9GPftTU1HTFFVc8/fTT\ng5ohQkgGtRES0lNjx44FcOjQoenTp7/00ksjR45cs2aNz+cD8OCDD44YMeLdd9+99tpr582b\nN3nyZADnnXdecXExgLvvvjs/P/+LL74oLCwEcO+99y5ZsuTuu+++9tprQ6HQoOaJEEIlQkJ6\nzF12zv332Wef3bFjhxsFASQSCSFEKpXq/K54PL569eprrrmGc97c3Nzc3JxMJq+//vpkMrl+\n/fpTmX5CSJeoREhIT5WXlwM47bTTABQXFx84cODtt9/evHnz559/vm7dOrfKtLN9+/YBeOih\nhx566KEOL9XW1g5wkgkhJ0aBkJAekVJu27Zt1KhRuq4DeOqpp+68886ioqJLLrnkO9/5zq9+\n9atly5Z1+UbbtgHcfffdl156aYeXpk6dOtDJJoScEAVCQnrkgw8+2LFjxx133AEgkUj86Ec/\n+v73v//b3/6Wcw5ASplMJrt8o9teyBhbvHhx68aKiopdu3aFw+FTkXRCyHFRGyEhJ7Zz586b\nbrpJ07S7774bwIEDB0zTnDFjhhsFAaxataqhoUEI0fZd7p/5+fmLFi169tlnq6qq3O22ba9Y\nseLaa6/1er2nNh+EkC5QiZCQLvzxj3/cvHkzAMMwtm3btmbNmmQy+etf/9qdVmbq1Kljxoy5\n//77t27dWlZWtnHjxnXr1o0fP/7dd9/99a9/feutt7oR7uRHx7wAAAD8SURBVJFHHrn00ksv\nvPDCxx577IILLjj99NOvu+46VVVXr169Y8eOl19+WVXpB0jIECAJIW08//zzHX4j+fn5l1xy\nyQcffNB2ty1btixZsiQUCo0bN2758uWHDh169913x48ff9VVV0kpKyoqLr74Yp/Pd/PNN7v7\nf/nll9/85jdHjx4dCoUWLVq0evXqQcgbIaQrTEo5KAGYEEIIGQqojZAQQsiwRoGQEELIsEaB\nkBBCyLBGgZAQQsiwRoGQEELIsEaBkBBCyLBGgZAQQsiwRoGQEELIsEaBkBBCyLBGgZAQQsiw\nRoGQEELIsEaBkBBCyLBGgZAQQsiw9n8AmVhEi3SnWfQAAAAASUVORK5CYII=",
      "text/plain": [
       "plot without title"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "support <- ggplot(data, aes(x=Date, y=Recommendation,\n",
    "                            color=Rating)) +\n",
    "           geom_line(aes(linetype=Rating), alpha=0.8)\n",
    "support"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "可以看到点赞的几个峰值均出现在“力荐”和“推荐”这里,表明主流的评价还是偏向好的一面。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "R 3.5",
   "language": "R",
   "name": "ir35"
  },
  "language_info": {
   "codemirror_mode": "r",
   "file_extension": ".r",
   "mimetype": "text/x-r-source",
   "name": "R",
   "pygments_lexer": "r",
   "version": "3.6.0"
  },
  "toc": {
   "nav_menu": {},
   "number_sections": false,
   "sideBar": true,
   "skip_h1_title": false,
   "title_cell": "Table of Contents",
   "title_sidebar": "Contents",
   "toc_cell": false,
   "toc_position": {},
   "toc_section_display": true,
   "toc_window_display": false
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
